小编Ved*_*agh的帖子

在 Android 12 (SDK 31) 中获取 android.app.ForegroundServiceStartNotAllowedException

我将我的应用程序升级targetSdkVersioncompileSdkVersionSDK 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)

java service android kotlin android-studio

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

Android Studio 3.5自动格式化/重构XML布局会更改视图顺序

因此昨天升级到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文件的重构要大得多。

android android-layout android-studio android-studio-3.5

27
推荐指数
0
解决办法
620
查看次数

E/ViewRootImpl: sendUserActionEvent() 返回

我已经在其他设备上测试了我的应用程序。它运行良好,但是当我将它安装在我的三星 Galaxy S8 上时。它没有给我任何 UI 更改,但是从 logcat,我可以看到/ViewRootImpl: sendUserActionEvent() returned. 如果有人知道问题出在哪里,请与我分享解决方案 TIA

android

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

ImageView android:cropToPadding,它实际上是做什么的?

我在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)

这里面ImageViewcropToPadding标签,ImageView主屏幕上大概有 20 个,里面都有这个标签,而且应用程序显然需要时间来加载因为有更多的图像,但是删除图像不是一个选项,所以我发现当我遇到这个标签时,那些没用的东西试图优化布局。

删除此标签不会改变中显示的图像ImageView,但每个图像都包含此标签肯定有某种原因。所以我开始寻找这个标签的作用,文档并不清楚为什么应该使用这个标签。

有人可以解释一下这个标签对图像的作用吗?我发现的资源并不多,我发现的只是“将图像裁剪为填充”,这是什么意思!我知道填充是什么,我知道裁剪是什么,但是“设置此 ImageView 是否将裁剪为填充”是什么意思?

android imageview android-layout android-imageview

5
推荐指数
1
解决办法
1125
查看次数

在Android代码优化中,SharedPreferences的“ commit()”会自动更改为“ apply()”吗?

所以,我现在正面临这个奇怪的问题。我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(),更改都会立即写入,并且在重新启动应用程序后会成功更改语言。

因此,问题是:

  1. 如果有很大的不同,编写代码commit()apply()声明使用apply()而不是完全安全的人会立即写出数据,但是会在后台执行呢?commit()commit()apply()

  2. 如果我构建了apk,如果我不使用返回值,它将在代码优化中commit()被替换apply()(我知道我可以通过构建应用程序的发行版来知道这一点,但是我仍然不确定,因为当我使用apply()veerery 时,它通常更改1/10次,但确实会从SharedPreference更改值

一张纸条:

  1. 我知道如何使用Apply()并仍然使我的应用程序正常工作,也许我必须在重新启动应用程序之前添加一些延迟?但是我不确定它将如何工作,因为在磁盘上实际写入数据还需要一些时间,而且我目前看不到任何方法来检查SharedPreference值是否已实际更改,因此我可以值更改后,请安全重启。

java android sharedpreferences

5
推荐指数
1
解决办法
71
查看次数

将同意转发给 Facebook Audience Network SDK (GDPR)

我添加了来自 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?

android facebook-audience-network

5
推荐指数
1
解决办法
1098
查看次数

即使授予了权限,checkSelfPermission 也会返回 false

所以我已经在这里坐了 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)

android android-storage

3
推荐指数
1
解决办法
586
查看次数