标签: android-7.0-nougat

Android - WebView语言在Android N上突然改变

我有一个多语言的应用程序与主要语言英语和第二语言阿拉伯语.

文档中所述,

  • android:supportsRtl="true"在清单中添加了.
  • 我已经改变了所有XML属性与leftright属性start,并end分别.
  • 我已添加阿拉伯语言字符串strings-ar(和其他资源类似).

以上设置正常.改变后的Localear-AE,阿拉伯文字和资源都正确地显示在我的活动.

但是,每次我导航到Activitya WebView 和/或a时WebViewClient,语言环境,文本和布局方向都会突然恢复为设备默认值.

进一步提示:

  • 在具有Android 7.0的Nexus 6P上发生.一切都在Android 6.0.1及更低版本上正常运行.
  • 只有当我导航到Activity有a WebView和/或a WebViewClient(并且我有几个)时才会发生语言环境的突然转变.它不会发生在任何其他活动上.

Android 7.0具有多语言环境支持,允许用户设置多个默认语言环境.因此,如果我将主要区域设置为Locale.UK:

在此输入图像描述

然后在导航到时WebView,语言环境从更改ar-AEen-GB.

Android 7.0 API更改:

API更改列表中所示,API 24中的以下类中添加了与语言环境相关的新方法:

Locale:

Configuration:

但是,我正在使用API​​ 23构建我的应用程序,并且我没有使用任何这些新方法.

此外......

  • 问题也出现在Nexus …

android locale android-webview android-7.0-nougat android-chrome

57
推荐指数
4
解决办法
1万
查看次数

SSLHandshakeException:Android N/7.0上的握手失败

我工作的一个应用程序为其(功率)的用户必须建立自己的服务器(即Nginx的)运行的后台程序.需要在应用程序中配置相应的域才能连接.我一直在测试我自己的手机(索尼z3c)并开始开发5.1.后来我收到了6.0的更新,但仍在模拟器中维护了一个工作5.1.不久前,我开始研究带有7.0图像的AVD,我很惊讶它不会连接到我的服务器,告诉我ssl握手失败了.我的nginx配置非常严格,但它适用于5.1和6.0,所以......?!

这就是我所知道的:

  • 我使用v24作为支持库,即我的compileSdkVersion是24.
  • 我使用Volley v1.0.0.
  • 我已经尝试过TLSSocketFactory,但它没有改变任何东西.这似乎大部分时间都用于阻止SSL3用于较旧的SDK版本.
  • 我已经尝试增加超时,但它没有改变任何东西.
  • 我已经尝试过直接使用HttpURLConnection,但它不会改变堆栈跟踪之外的任何东西(它没有凌空引用,但是完全不同).

如果没有TLSSocketFactory,则通过裸实请求队列进行请求,实例化为Volley.newRequestQueue(context).

这是我在android studio中看到的:

W/System.err: com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: Connection closed by peer
W/System.err:     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:151)
W/System.err:     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)
W/System.err: Caused by: javax.net.ssl.SSLHandshakeException: Connection closed by peer
W/System.err:     at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)
W/System.err:     at com.android.okhttp.Connection.connectTls(Connection.java:235)
W/System.err:     at com.android.okhttp.Connection.connectSocket(Connection.java:199)
W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:172)
W/System.err:     at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)
W/System.err:     at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:257)
W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
W/System.err: …
Run Code Online (Sandbox Code Playgroud)

ssl android elliptic-curve sslhandshakeexception android-7.0-nougat

55
推荐指数
5
解决办法
4万
查看次数

Android N以编程方式更改语言

我发现非常奇怪的错误只能在Android N设备上重现.

在浏览我的应用程序时,有可能改变语言.这是改变它的代码.

 public void update(Locale locale) {

    Locale.setDefault(locale);

    Configuration configuration = res.getConfiguration();

    if (BuildUtils.isAtLeast24Api()) {
        LocaleList localeList = new LocaleList(locale);

        LocaleList.setDefault(localeList);
        configuration.setLocales(localeList);
        configuration.setLocale(locale);

    } else if (BuildUtils.isAtLeast17Api()){
        configuration.setLocale(locale);

    } else {
        configuration.locale = locale;
    }

    res.updateConfiguration(configuration, res.getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)

这段代码非常适合我的游览活动(通过recreate()调用),但在所有下一个活动中,所有String资源都是错误的.屏幕旋转修复它.我该怎么办这个问题?我应该以不同方式更改Android N的区域设置,还是只是系统错误?

PS这是我发现的.首次启动MainActivity(在我的巡演之后)Locale.getDefault()是正确的,但资源是错误的.但在其他活动中,它给了我错误的Locale和来自此语言环境的错误资源.旋转屏幕(或可能是其他一些配置更改)Locale.getDefault()是正确的.

java android android-7.0-nougat

52
推荐指数
3
解决办法
3万
查看次数

Job Scheduler未在Android N上运行

Job Scheduler在Android Marshmallow和Lollipop设备上按预期工作,但它没有运行和Nexus 5x(Android N预览版).

用于安排作业的代码

        ComponentName componentName = new ComponentName(MainActivity.this, TestJobService.class.getName());
        JobInfo.Builder builder;
        builder = new JobInfo.Builder(JOB_ID, componentName);
        builder.setPeriodic(5000);
        JobInfo jobInfo;
        jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        jobInfo = builder.build();
        int jobId = jobScheduler.schedule(jobInfo);
Run Code Online (Sandbox Code Playgroud)

服务在清单中定义为:

<service android:name=".TestJobService"
            android:permission="android.permission.BIND_JOB_SERVICE" />
Run Code Online (Sandbox Code Playgroud)

在Android N(预览版)上是否有任何人遇到此问题?

android android-jobscheduler android-7.0-nougat

41
推荐指数
3
解决办法
3万
查看次数

使用ScanSettings.SCAN_MODE_OPPORTUNISTIC,"应用程序扫描过于频繁"

我注意到三星S8,Android 7.0上的问题(更新.这也发生在Android 7.0上:三星S7,Nexus 5x),它告诉(经过几次测试)应用程序扫描过于频繁:

08-14 12:44:20.693 25329-25329/com.my.app D/BluetoothAdapter: startLeScan(): null
08-14 12:44:20.695 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.696 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.698 25329-25329/com.my.app D/BluetoothLeScanner: Start Scan
08-14 12:44:20.699 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.700 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.700 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.701 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.703 4079-4093/? D/BtGatt.GattService: registerClient() - UUID=dbaafee1-caf1-4482-9025-b712f000eeab
08-14 12:44:20.807 4079-4204/? D/BtGatt.GattService: onClientRegistered() - UUID=dbaafee1-caf1-4482-9025-b712f000eeab, clientIf=5, status=0
08-14 12:44:20.808 25329-25342/com.my.app D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 mClientIf=0
08-14 12:44:20.809 4079-7185/? D/BtGatt.GattService: start scan with …
Run Code Online (Sandbox Code Playgroud)

android bluetooth-lowenergy android-bluetooth samsung-galaxy android-7.0-nougat

41
推荐指数
1
解决办法
3452
查看次数

Android PackageStats提供负值

我正在使用PackageStats并在打印PackageStats的codeSize,cacheSize,dataSize时,一些数据将变为负数.

几个问题:

  • 这怎么可能?
  • 考虑到apk大小约为50MB,codeSize可能是负面的情况是什么?
  • 可以可靠地用于提取上述信息的任何其他方式?

另外,对于Android N,它给了我"NoSuchMethodException".所以,

  • 它是为Android N删除还是有某种方式使用它?
  • 任何可以帮助我计算上述尺寸的替代品?

码:

PackageManager packageManager = context.getPackageManager();
Method myUserId = UserHandle.class.getDeclaredMethod("myUserId");
int userID = (Integer) myUserId.invoke(packageManager);

Method getPackageSizeInfo = packageManager.getClass().getDeclaredMethod("getPackageSizeInfo", String.class, int.class,
IPackageStatsObserver.class);
getPackageSizeInfo.invoke(packageManager, context.getPackageName(), userID, new IPackageStatsObserver.Stub() {

    @Override
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
        long codeSize = pStats.codeSize / MB; //long MB = 1024*1024;
        long cacheSize = pStats.cacheSize / MB;
        long dataSize = pStats.dataSize / MB;
        long appSize = codeSize + cacheSize + dataSize;
    };
}
Run Code Online (Sandbox Code Playgroud)

java android android-7.0-nougat

39
推荐指数
1
解决办法
685
查看次数

在Android 7(API级别24)中,我的应用程序不允许静音手机(将铃声模式设置为静音)

我有一个应用程序,通过使用AudioManager将手机静音,并使用此代码将铃声模式设置为静音:

AudioManager audioManager = 
    (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
try {
    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT)
} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

这适用于Android 6,但现在使用Android 7,我收到以下错误:

System.err: java.lang.SecurityException: Not allowed to change Do Not Disturb state
System.err: at android.os.Parcel.readException(Parcel.java:1683)
System.err: at android.os.Parcel.readException(Parcel.java:1636)
System.err: at android.media.IAudioService$Stub$Proxy.setRingerModeExternal(IAudioService.java:962)
System.err: at android.media.AudioManager.setRingerMode(AudioManager.java:1022)
System.err: at controllers.SearchResultController.mutePhone(SearchResultController.java:185)
Run Code Online (Sandbox Code Playgroud)

有什么新的权限我需要要求才能使这项工作?

我查看了Android权限列表,但找不到任何相似的内容.

android android-audiomanager android-7.0-nougat

38
推荐指数
3
解决办法
2万
查看次数

当app被杀/在后台时,检测Android 7及更高版本中的连接变化

问题:

所以问题是我有一个应用程序,当连接WiFi(连接的SSID和其他信息)或断开连接(通过移动网络)时,它会向我们的后端发送请求.但是,随着Android 7/N及更高版本的更改,CONNECTIVITY_CHANGE和CONNECTIVITY_ACTION不再在后台运行.现在大多数情况下人们滥用这个广播,因此我完全理解为什么要做出改变.但是,我不知道如何在当前状态下解决这个问题.

现在我不是一个Android开发人员(这是一个Cordova插件),所以我指望你们!

预期行为: 即使应用程序被杀/在后台,每当WiFi切换连接时,应用程序都会被唤醒并发送请求.

当前行为: 应用程序仅在应用程序位于前台时发送请求.

到目前为止尝试过: 到目前为止,我已经移动隐藏的意图,从清单中侦听CONNECTIVITY_ACTION,并在应用程序的主要部分(插件)中手动注册它.这使得它只要应用程序在内存中就可以工作,但不能在冷启动或实际背景下工作

已经看过: 大多数答案谈论使用预定的工作来代替丢失的广播.我看到这是如何工作的,例如,重试下载或类似,但不适用于我的情况(但如果我错了请纠正我).以下是我已经看过的SO帖子:

当应用程序处于前台时,检测Android 7.0 Nougat上的连接更改

不推荐使用ConnectivityManager.CONNECTIVITY_ACTION

使用JobScheduler检测连接更改

Android O - 检测后台连接的变化

android android-7.0-nougat android-8.0-oreo

37
推荐指数
2
解决办法
3万
查看次数

AlertDialog上缺少按钮| Android 7.0(Nexus 5x)

我正在尝试创建一个AlertDialog但按钮没有显示.仅在Android 7.0中看到此问题:

final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs location access");
builder.setMessage("Please grant location access so this app can detect beacons.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    @TargetApi(Build.VERSION_CODES.M)
    public void onDismiss(final DialogInterface dialog) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
    }
});
builder.show();
Run Code Online (Sandbox Code Playgroud)

AlertDialog

android invisible button android-alertdialog android-7.0-nougat

34
推荐指数
4
解决办法
1万
查看次数

在Android 7.0和Samsung设备上使用Dagger 2的RuntimeException

在我的Google Play控制台上,自从我开始使用Dagger 2以来,我看到了很多崩溃报告,但仅限于Android 7.0,主要是三星设备,一些Huawai和Motorola设备以及一些罕见的Xperia设备:

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2984)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3045)
  at android.app.ActivityThread.-wrap14 (ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1642)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:154)
  at android.app.ActivityThread.main (ActivityThread.java:6776)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1518)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1408)
Caused by: java.lang.RuntimeException: 
  at dagger.android.AndroidInjection.inject (AndroidInjection.java:48)
  at dagger.android.support.DaggerAppCompatActivity.onCreate (DaggerAppCompatActivity.java:43)
  at com.package.MainActivity.onCreate (MainActivity.java:83)
  at android.app.Activity.performCreate (Activity.java:6956)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1126)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2927)
Run Code Online (Sandbox Code Playgroud)

我无法重现这个问题,因为我手边没有任何受影响的设备,似乎并非所有类型的设备都受到影响,更像是随机启动失败.

从我通过研究得到的结果是,在活动实际附加到应用程序之前,很可能会调用活动onCreate.但我无法证明这一说法......

我正在关注Google的MVP + Dagger架构蓝图.

我的应用类:

public class App extends DaggerApplication {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    protected AndroidInjector<? extends DaggerApplication> …
Run Code Online (Sandbox Code Playgroud)

android samsung-mobile dagger-2 android-7.0-nougat

31
推荐指数
1
解决办法
3097
查看次数