Articles of android 8.0 oreo

facebook + android:只有全屏不透明活动才能请求定位

Facebook SDK版本4.27.0 Android OS 8.0版 应用程序崩溃,例外,这是我在Crashlytics上find的跟踪日志: Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.yyy/com.facebook.FacebookActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2822) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2897) at android.app.ActivityThread.-wrap11(Unknown Source) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1598) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:251) at android.app.ActivityThread.main(ActivityThread.java:6563) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Caused by java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation at android.app.Activity.onCreate(Activity.java:986) […]

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

问题: 所以问题是我有一个应用程序,当连接WiFi(连接的SSID和其他信息)或断开连接(通过移动网络)时,它会向我们的后端发送请求。 但是,随着Android 7 / N及更高版本的更改,CONNECTIVITY_CHANGE和CONNECTIVITY_ACTION不再在后台运行。 现在大多数情况下人们滥用这个广播,因此我完全理解为什么要做出改变。 但是,我不知道如何在当前状态下解决这个问题。 现在我不是一个Android开发人员(这是一个Cordova插件),所以我指望你们! 预期行为:即使应用程序被杀/在后台,每当WiFi切换连接时,应用程序都会被唤醒并发送请求。 当前行为:应用程序仅在应用程序位于前台时发送请求。 到目前为止尝试过:到目前为止,我已经将隐含的意图从清单中移动到侦听CONNECTIVITY_ACTION,并在应用程序的主要部分(插件)中手动注册它。 这使得它只要应用程序在内存中就可以工作,但不能在冷启动或实际背景下工作 已经看过:大多数答案谈论使用预定的工作来代替丢失的广播。 我看到这是如何工作的,例如,重试下载或类似,但不适用于我的情况(但如果我错了请纠正我)。 以下是我已经看过的SOpost: 当应用程序处于前台时,检测Android 7.0 Nougat上的连接更改 不推荐使用ConnectivityManager.CONNECTIVITY_ACTION 使用JobScheduler检测连接更改 Android O – 检测后台连接的变化

即使我没有设置声音,Android Oreo通知也会继续发出声音。 在旧版本,完美的工作

所以我正在使我的应用程序与Oreo兼容并面临通知问题。 我根据文档添加了通知频道,除了通知在每个post上发出声音之外,一切都很顺利,尝试将默认值设置为0。 我正在模拟器中测试我的应用程序,非常感谢任何帮助。 使用此代码创建频道 NotificationCompat.Builder builder = new NotificationCompat.Builder(PlayerService.this, “channel_01”) .setAutoCancel(false) .setContentIntent(pendingIntent) .setContent(viewsSmall) .setCustomBigContentView(viewsExpanded) .setDeleteIntent(pSwipeToDismiss); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { builder.setVisibility(Notification.VISIBILITY_PUBLIC); } if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { builder.setPriority(Notification.PRIORITY_MAX); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { /* Create or update. */ NotificationChannel channel = new NotificationChannel(“channel_01”, “Playback Notification”, NotificationManager.IMPORTANCE_DEFAULT); mNotificationManager.createNotificationChannel(channel); mBuilder.setChannelId(“channel_01”); } final Notification notification = builder.build(); […]

Android自动填充:dispatchProvideAutofillStructure()未布局

我已经使用compileSdkVersion 26配置我的应用程序以支持Android Oreo。 我还为我的电话号码输入字段设置了android:autofillHints=”phone” 。 当我点击该字段时,我可以看到“自动填充”popup。 但是,当我点击“自动填充”时 , “内容无法自动填充”吐司出现,我在logcat中看到以下跟踪: RemoteFillService Not handling { when=-3ms what=3 target=com.android.internal.os.HandlerCaller$MyHandler } as service for ComponentInfo{com.google.android.gms/com.google.android.gms.autofill.service.AutofillService} is already destroyed View dispatchProvideAutofillStructure(): not laid out, ignoring 我该怎么解决这个问题? 我已确认在设置>系统>语言和输入>高级>输入辅助>自动填充服务中配置了电话号码。 使用示例XML进行更新:在API 26模拟器设置中,我可以选择“使用Google自动填充”。 使用Android Studio的Design选项卡,我添加了一个“Phone”types的EditText ,然后在XML元素中手动插入android:autofillHints=”phone” : 使用此XML可以观察到上述Logcat特性。

自定义JobIntentService onHandleWork未调用

我最近正在更新一个应用程序,我使用JobIntentService而不是常规的IntentService来处理来自push的通知,因为它似乎是在棒棒糖前设备和post上处理此问题的正确方法。 我这样排队工作: enqueueWork(context, MyJobServiceExtension.class, JOB_ID, work); 这是清单声明: 我从未在onHandleWork中看到任何回调或在我的logcat中看到任何错误日志。 有没有人成功整合这可能会有所帮助? 更新:我在api级别21设备上测试了它并且它工作..但它似乎没有被调用我的android O像素XL设备..任何线索为什么? 更新#2:我似乎也看到了intentservice的onCreate被调用,但没有其他生命周期方法(包括onHandleWork)。 有人遇到过这个吗?

调用SmsManager.sendTextMessage()时,Android 8需要READ_PHONE_STATE

我的应用程序无法在新的Android 8更新上发送短信。 我收到错误,我没有READ_PHONE_STATE权限。 java.lang.SecurityException: Neither user 10179 nor current process has android.permission.READ_PHONE_STATE. at android.os.Parcel.readException(Parcel.java:1942) at android.os.Parcel.readException(Parcel.java:1888) at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:789) at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:329) at android.telephony.SmsManager.sendTextMessage(SmsManager.java:312) at com.cordova.plugins.sms.Sms.send(Sms.java:192) at com.cordova.plugins.sms.Sms.access$400(Sms.java:22) at com.cordova.plugins.sms.Sms$1.run(Sms.java:102) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) 通常这种错误很好 – 我只是意识到我需要一个许可并要求它。 但在这种情况下,我找不到任何需要READ_PHONE_STATE才能使用SmsManager的文档。 这里既没有sendTextMessage也没有新的Android 8 更新说明 。 后者提到要获得硬件序列号,我现在需要READ_PHONE_STATE权限。 进一步研究我发现很多其他人都遇到过这个问题,但除了要求获得许可之外,没有任何人有任何细节或解决方案。 所以今天我用简单的纯应用程序重新创建了问题,只需要SEND_SMS权限并发送短信。 并得到了完全相同的问题。 它适用于Android 8以下的所有内容。但是在Android 8上崩溃了权限错误。如果有人想要重新创建它,这是源代码。 compileSdkVersion 26 buildToolsVersion “26.0.2” defaultConfig { […]

奥利奥 – 前景服务不显示前景通知

到目前为止,我已经调整了我的代码以使用ContextCompat.startForegroundService(context, intentService); 开始我的服务。 这样,它适用于android <26和android 26(Oreo)。 我仍然看到一个区别,在android oreo我没有看到我的自定义前景通知(我只看到“应用程序在后台运行”通知)。 我还需要调整任何东西吗? 我的服务看起来像这样: public class BaseOverlayService extends Service { @Override public void onCreate() { super.onCreate(); moveToForeground(); } private void moveToForeground() { Notification notification = …; super.startForeground(NOTIFICATION_ID, notification); } } 官方的例子 此示例( https://github.com/googlesamples/android-play-location/blob/master/LocationUpdatesForegroundService/app/src/main/java/com/google/android/gms/location/sample/locationupdatesforegroundservice/LocationUpdatesService.java #L200 )显示为注释,我应该使用以下,但startServiceInForeground不存在… if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) { NotificationManager mNotificationManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)); mNotificationManager.startServiceInForeground(new Intent(this, BaseOverlayService.class), NOTIFICATION_ID, […]

Oreo 8.0 / 8.1中未显示启动器图标

说明: 我在谷歌游戏市场有一个工作的应用程序。 在4.0-7.0的Android版本中一切正常。 案件: 当客户端在他的Android 8.0(奥利奥)上下载它时,启动器图标似乎没有显示,而是显示了android的默认启动器图标! 题: 谁遇到过这样的问题? 我需要任何提示来解决它因为它看起来很奇怪,因为我在mipmap文件夹中有所有4个types的.png图标。

ANR错误“为Android 7.1和8.0广播Intent {act = com.google.firebase.INSTANCE_ID_EVENT”…“FirebaseInstanceIdInternalReceiver”

我们有一个Android应用,最近报告了很多ANR错误。 这仅发生在Android 7.1和8.0上(不在例如4.4,5.0或6.0上)。 ANR是: Broadcast of Intent { act=com.google.firebase.INSTANCE_ID_EVENT flg=0x14 cmp=com.our.package.name/com.google.firebase.iid.FirebaseInstanceIdInternalReceiver (has extras) } 问题是: 为什么我们得到这个ANR,我们可以做些什么来避免这种情况? 请注意,这在早期的Android版本中运行良好,我认为这certificate我们没有做任何导致ANR的新手错误。 我很难再现这个bug。 由于它仅适用于Android 7.1和8.0,我认为它可能与新的打盹模式和节省电池有关,但即使使用adb shell dumpsys deviceidle force-idle 等 ,测试时也不会重现此问题,也不会放入SystemClock.sleep(20000); 几个地方。 我们的InstanceIdService代码是: public class InstanceIdService extends FirebaseInstanceIdService { private Analytics mAnalytics; @Override public void onCreate() { super.onCreate(); mAnalytics = new AnalyticsImpl(); boolean isFullVersion = getApplicationContext().getPackageName().endsWith(“full”); mAnalytics.init(getApplicationContext(), isFullVersion); } @Override […]

如何正确更新Android 8.0中的小部件 – Oreo – API 26

假设我有一个用于将targetSDKVersion设置为26的应用程序的小部件。此小部件需要100毫秒到10秒才能更新。 大部分时间都在1s以下。 在Android O之前,如果在我的AppWidgetProvider上调用了onUpdate(),我可以启动后台服务来更新这个小部件。 但是,如果您尝试该行为,Android O将返回IllegalStateException。 启动前台服务的明显解决方案似乎是一种极端的措施,可以在99%的时间内完成10秒以内的事情。 可能的解决方案 启动前台服务以更新窗口小部件。 用户通知会在10s内消失。 使用JobScheduler尽快安排作业。 您的小部件可能会或可能不会更新一段时间。 尝试在广播接收器中完成工作。 锁定任何其他应用程序的UI线程。 呸。 尝试在小部件接收器中工作。 锁定任何其他应用程序的UI线程。 呸。 滥用GCM以运行后台服务。 很多工作和感觉hacky。 我个人并不喜欢上述任何解决方案。 希望我错过了一些东西。 (更令人沮丧的是,我的应用程序已经被系统调用onUpdate()加载到内存中。我没有看到如何将我的应用程序加载到内存中以调用onUpdate(),但后来没有给我的应用程序1s更新小部件UI线程正在为任何人节省电池寿命。)