gpt4 book ai didi

android - 应用程序在 Android 10 上崩溃?

转载 作者:行者123 更新时间:2023-12-03 13:27:46 27 4
gpt4 key购买 nike

我的应用程序在 Play Store 上运行了 2 年,并且运行良好。但在过去两周内,突然有用户报告应用程序在使用时崩溃。

所有崩溃均针对 Android 10 用户。

Fabric 日志显示错误为,

java.lang.IllegalStateException: Only owner is able to interact with pending media content://media/external/images/media/259525
at android.os.Parcel.createException(Parcel.java:2079)
at android.os.Parcel.readException(Parcel.java:2039)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:151)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:705)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1687)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1503)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1420)
at android.graphics.ImageDecoder$ContentResolverSource.createImageDecoder(ImageDecoder.java:277)
at android.graphics.ImageDecoder.decodeDrawableImpl(ImageDecoder.java:1743)
at android.graphics.ImageDecoder.decodeDrawable(ImageDecoder.java:1736)
at android.widget.ImageView.getDrawableFromUri(ImageView.java:1022)
at android.widget.ImageView.resolveUri(ImageView.java:991)
at android.widget.ImageView.setImageURI(ImageView.java:568)
at androidx.appcompat.widget.AppCompatImageView.setImageURI(AppCompatImageView.java:116)
at androidx.databinding.adapters.ImageViewBindingAdapter.setImageUri(ImageViewBindingAdapter.java:46)

此屏幕上发生的情况是,用户应该捕获屏幕截图。我保存了这个屏幕截图,稍后在 ImageView 上显示。 .我通过 URI 检索屏幕截图图像.

当我使用 URI 检索图像时发生崩溃 .
  • 应用编译SDK版本:28
  • 应用目标 SDK 版本:28
  • 最佳答案

    让我解释一下你得到这个异常的确切原因以及如何解决它
    但首先,请仔细记住您的错误信息

    "Only owner is able to interact with pending mediacontent://media/external/images/media/259525"


    请记住“所有者”这个词,因为稍后在我的解释中您将知道这个词的含义。
    我是如何遇到这个异常的:
    我正在开发一个已经在 Play Store 上运行的 pdf 阅读器应用程序。
    我们也从 crashlytics 得到了同样的异常(exception)。就像您的情况一样,大多数设备都是 Android 10。
    为什么这个异常发生在我的案例中
    一些用户过去常做的是,
    他们会开始从网络下载一个pdf文件,
    然后他们会意识到,pdf尺寸太大,
    然后他们会暂停 pdf 下载(也许以后再下载),
    然后他们会去文件管理器并尝试用我的应用程序打开部分下载的 pdf 文件。
    此时,由于部分下载了 pdf,我的应用程序将在 openInputStream() 方法中崩溃(就像您在 openAssetFileDescriptor() 中的崩溃一样)
    “所有者”一词的含义:
    “所有者”这个词在这里非常重要。让我来告诉你为什么。
    就我而言,最终用户过去常常使用下载管理器(chrome 内部)下载 pdf。所以下载管理器从网络上获取文件包,重新组装它们并重新创建原始文件。现在,只要文件没有完全下载并重新组装,下载管理器将保持该文件的“所有者”。这意味着文件将被同步进程锁定,只有下载管理器有权释放锁定。因此,当文件完全下载后,chrome 将释放该文件的锁定,并且该文件将可供所有其他应用程序访问。
    我是如何解决崩溃的:
    我用 try-catch block 包围了错误行。如果我得到 IllegalStateException 我会向用户展示一个 toast ,文件已部分下载或损坏
    我做了这样的事情
        try{
    try (InputStream in = getContentResolver().openInputStream(uri);)
    {
    -------
    -------
    } catch (IOException | SecurityException e) {
    Timber.e(e, "Could not save work file");
    finishError(getString(R.string.mopria_document_reading_error));
    }
    }catch(IllegalStateException exception){
    Toast.makeText(getApplicationContext(), "The file is either partially
    downloaded or corrupted", Toast.LENGTH_LONG).show();
    finishAndRemoveTask();
    }
    为什么Android 10 主要是:
    该问题不仅仅针对 android 10。巧合的是,android 为大多数服务(如 chrome、google 文件等)推出了更新,允许其他应用程序查看这些部分创建的文件。
    在您的情况下:
    屏幕截图将由 android 的屏幕截图管理器捕获(我不记得确切的名称)。因此,只要将捕获的屏幕截图保存到存储中,您就无法获取屏幕截图。在较新的 android 版本中,当捕获屏幕截图时,您将获得该屏幕截图的快速预览。除非进行预览,否则屏幕截图管理器将是该文件的所有者。

    关于android - 应用程序在 Android 10 上崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60523050/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com