我将我的应用程序升级targetSdkVersion到compileSdkVersionSDK 31,并开始在后台更新小部件的服务中的应用程序中收到以下崩溃消息。
java.lang.RuntimeException:
at android.app.ActivityThread.handleReceiver (ActivityThread.java:4321)
at android.app.ActivityThread.access$1600 (ActivityThread.java:247)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2068)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loopOnce (Looper.java:201)
at android.os.Looper.loop (Looper.java:288)
at android.app.ActivityThread.main (ActivityThread.java:7842)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003)
Caused by: android.app.ForegroundServiceStartNotAllowedException:
at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel (ForegroundServiceStartNotAllowedException.java:54)
at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel (ForegroundServiceStartNotAllowedException.java:50)
at android.os.Parcel.readParcelable (Parcel.java:3333)
at android.os.Parcel.createExceptionOrNull (Parcel.java:2420)
at android.os.Parcel.createException (Parcel.java:2409)
at android.os.Parcel.readException (Parcel.java:2392)
at android.os.Parcel.readException (Parcel.java:2334)
at android.app.IActivityManager$Stub$Proxy.startService (IActivityManager.java:5971)
at android.app.ContextImpl.startServiceCommon (ContextImpl.java:1847)
at android.app.ContextImpl.startForegroundService (ContextImpl.java:1823)
at android.content.ContextWrapper.startForegroundService (ContextWrapper.java:779)
at android.content.ContextWrapper.startForegroundService (ContextWrapper.java:779)
at com.mypackage.appname.ui.widget.widget_package.WidgetClassName.onUpdate (WidgetClassName.java:48) …Run Code Online (Sandbox Code Playgroud) 因此昨天升级到Android Studio 3.5,在自动格式化XML布局时带来了奇怪的问题。
自动格式化时,布局内的所有视图都会更改顺序。因此,如果视图位于内部LinearLayout,则它们将更改顺序,所有类似类型的视图将合并在一起。我只是LinearLayout作为示例,它在XML中无处不在。
我在Android Studio中尝试了XML布局的意外自动格式化,但这对我不起作用。这是Android Studio本身的错误吗?还是在升级时弄乱了一些设置?
这是发生这种情况的视频https://youtu.be/1emrQFksg30。我按Ctrl + Alt + L进行自动格式化。
这尤其是一个问题,LinearLayout因为元素顺序很重要。我曾经ConstraintLayout急着在我的应用程序中测试某些东西。
重要:
如果您不想四处寻找答案,请参阅下面@kAliert的评论(因为有些人将此问题标记为重复)。
编辑:这个问题是关于我在布局中遇到的问题,这个问题应该与这个问题重复,它是关于Android Manifest(它也是XML,但是没有多少人会遇到这个问题,因为很多人会与清单文件相比重构布局)。即使在搜索后,我个人也无法找到问题的答案,因为该问题不包含任何与布局有关的内容,因此我搜索了布局,这比Manifest文件的重构要大得多。
我已经在其他设备上测试了我的应用程序。它运行良好,但是当我将它安装在我的三星 Galaxy S8 上时。它没有给我任何 UI 更改,但是从 logcat,我可以看到/ViewRootImpl: sendUserActionEvent() returned. 如果有人知道问题出在哪里,请与我分享解决方案 TIA
我在android:cropToPadding 这里浏览了标签的文档,它只说:
如果为 true,图像将被裁剪以适合其填充。
可能是布尔值,例如“true”或“false”。
这让我很难理解。
我的ImageView应用程序内部有一个(由其他人开发):
<ImageView
android:layout_width="125dp"
android:layout_height="125dp"
android:layout_gravity="center"
android:maxWidth="100dp"
android:padding="20dp" />
Run Code Online (Sandbox Code Playgroud)
这里面ImageView有cropToPadding标签,ImageView主屏幕上大概有 20 个,里面都有这个标签,而且应用程序显然需要时间来加载因为有更多的图像,但是删除图像不是一个选项,所以我发现当我遇到这个标签时,那些没用的东西试图优化布局。
删除此标签不会改变中显示的图像ImageView,但每个图像都包含此标签肯定有某种原因。所以我开始寻找这个标签的作用,文档并不清楚为什么应该使用这个标签。
有人可以解释一下这个标签对图像的作用吗?我发现的资源并不多,我发现的只是“将图像裁剪为填充”,这是什么意思!我知道填充是什么,我知道裁剪是什么,但是“设置此 ImageView 是否将裁剪为填充”是什么意思?
所以,我现在正面临这个奇怪的问题。我HAVE使用SharedPreferences.Editor()。提交()在我的Android应用程序,但是,因为文档在这里指出,
由于SharedPreferences实例是流程中的单例,因此如果您已经忽略了返回值,则可以安全地用apply()替换任何commit()实例。
您无需担心Android组件的生命周期及其与apply()写入磁盘的交互。该框架确保在切换状态之前完成对apply()的运行中磁盘写入。
基本上commit(),apply()如果您不使用返回值BUT,则可以安全地替换为BUT,这是这里提到的两者之间的区别,并且在Android Studio中警告说,这是commit()立即写入数据,而BUT apply()异步执行。
所以我的问题是,我正在更改应用程序中的语言,并且要在用户选择语言后重新启动应用程序。但是,当用户选择语言时,将输入当前选择的语言SharedPreferences。
现在,问题是:
每当我使用代码apply()代替此处commit()的代码并重新启动应用程序以在此处重新启动应用程序时,所做的更改都不会写入磁盘,因为当应用程序重新启动时,它不会更改当前语言,因为from的值SharedPreference不会更改,因为它不会立即写入磁盘。但是,无论何时使用commit(),更改都会立即写入,并且在重新启动应用程序后会成功更改语言。
因此,问题是:
如果有很大的不同,编写代码commit()并apply()声明使用apply()而不是完全安全的人会立即写出数据,但是会在后台执行呢?commit()commit()apply()
如果我构建了apk,如果我不使用返回值,它将在代码优化中commit()被替换apply()(我知道我可以通过构建应用程序的发行版来知道这一点,但是我仍然不确定,因为当我使用apply()veerery 时,它通常会更改1/10次,但确实会从SharedPreference更改值
一张纸条:
我添加了来自 Google 的 Consent SDK,并编写了代码,通过执行以下操作将欧盟用户的同意传递给 Admob SDK:
Bundle bundle = new Bundle();
bundle.putString("npa", "1");
AdRequest adRequest = new AdRequest.Builder()
.addNetworkExtrasBundle(AdMobAdapter.class, bundle).build();
adView.loadAd(adRequest);
Run Code Online (Sandbox Code Playgroud)
现在,我在 Facebook 文档中搜索了很多,这里的 Google Consent SDK 页面将我带到了这里,然后,我被带到了无用的页面,该页面只告诉我 GDPR,即https://www。 facebook.com/business/gdpr。
基本上,我想说的是我已经搜索了很多,但找不到任何与将用户同意传递给 Facebook SDK 相关的内容。
有谁知道在 Android 上请求广告时如何将同意传递给 FAN SDK?
所以我已经在这里坐了 4 个小时,我一直在挠头,为什么我的 2 个设备行为不端。问题是,即使授予了权限,checkSelfPermission 也会返回 false!我 100% 确定这不应该发生,因为它在 5-6 天前按预期工作。这是我用来检查是否授予权限的代码。
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v("BaseActivity", "Permission is granted");
return true;
} else {
Log.v("BaseActivity", "Storage Permission is revoked");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return false;
}
} else { //permission is automatically granted on sdk<23 upon installation
Log.v("BaseActivity", "Permission is granted");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我第一次打开BaseActivity具有此代码的活动 ( ) 时,它都会按预期工作并请求用户获得存储权限。但是,在此活动中的片段中,我想在其中访问文件,每当我调用此方法时,它都开始返回 false。我已经公开了这个方法,它曾经根据情况返回真/假。这是我检查 Fragment 中是否授予权限的方法。
if (!((BaseActivity) getActivity()).isStoragePermissionGranted()) {
Toast.makeText(getActivity(), …Run Code Online (Sandbox Code Playgroud)