【问题标题】:OnActivityResult always returns RESULT CANCELED (Code: 0) on Android 11OnActivityResult 在 Android 11 上始终返回 RESULT CANCELED (Code: 0)
【发布时间】:2022-02-02 08:19:03
【问题描述】:

遗憾的是,Android 11 的存储限制过于严格且令人困惑。

我正在尝试使用以下代码选择文档

    fun onFile(activity: AppCompatActivity?, fragmentContext: Fragment?, isMultiple: Boolean?, pFileMimeTypes: Array<String>?): Intent {
            val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
                action = Intent.ACTION_OPEN_DOCUMENT
                addCategory(Intent.CATEGORY_OPENABLE)
                putExtra(Intent.EXTRA_ALLOW_MULTIPLE, isMultiple ?: false)
                addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
            }
    
            val fileMimeTypes = pFileMimeTypes ?: FileUtil.mimeTypes
            intent.type = if (fileMimeTypes.size == 1) fileMimeTypes[0] else "*/*"
            if (!fileMimeTypes.isNullOrEmpty()) {
                intent.putExtra(Intent.EXTRA_MIME_TYPES, fileMimeTypes)
            }
    
    
            val list = activity?.packageManager?.queryIntentActivities(intent, PackageManager.MATCH_ALL)
            if (list?.size!! > 0) {
                if (fragmentContext == null) {
                    activity.startActivityForResult(
                            Intent.createChooser(
                                    intent,
                                    activity.getString(R.string.m_selectFile_txt)
                            ), FILE_CODE
                    )
                } else {
                    fragmentContext.startActivityForResult(
                            Intent.createChooser(
                                    intent,
                                    activity.getString(R.string.m_selectFile_txt)
                            ), FILE_CODE
                    )
                }
            }
// returning intent is not being used anywhere else
            return intent
        }

虽然我拥有所有文件访问权限Environment.isExternalStorageManager(),但在从外部存储(下载或任何文件夹)中选择文档(PDF)后,OnActvityResultresult code 0 调用。我需要所选文档的 Uri 才能继续进行。

对于任何其他参考,以下是我的清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="*****Hidden*******">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />
    <uses-permission android:name="android.permission.READ_STORAGE_PERMISSION"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"  />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.CAMERA" />

    <application
        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:requestLegacyExternalStorage="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
        <activity
            android:exported="true"
            android:name=".Main2Activity"
            android:launchMode="singleTask"
            android:label="@string/title_activity_main2"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:theme="@style/AppTheme.NoActionBar">

        </activity>

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.attachmentmanager"
            android:exported="false"
            android:grantUriPermissions="true"
            tools:replace="android:authorities">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_provider"
                tools:replace="android:resource" />
        </provider>
    </application>



    <queries>
        <intent>
            <action android:name="android.intent.action.OPEN_DOCUMENT" />
            <!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". -->
            <data android:mimeType="*/*" />
        </intent>
        <intent>
            <action android:name="android.intent.action.PICK" />
            <!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". -->
            <data android:mimeType="*/*" />
        </intent>
    </queries>


</manifest>

我一定错过了一些观点。 Android 11

下一切正常

提前致谢。

【问题讨论】:

  • addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) 删除这些行。你不能授予任何东西。
  • Although I have all files access permission 该权限与 ACTION_OPEN_DOCUMENT 无关,也不需要该权限。您根本不需要任何权限即可使用它。
  • 我不明白你在清单中的&lt;queries&gt;。它们不是必需的。也许他们会伤害......
  • @blackapps &lt;queries&gt; 用于包可见性。
  • 我不知道你为什么把这个动作称为一个包。但是我重复一遍:使用该操作不需要它们,您最好尝试不使用。也许它会导致你的问题。

标签: java android kotlin android-11 android-storage


【解决方案1】:

startActivityForResult 已弃用

参考这个link

使用活动结果 API Official Docs

【讨论】:

  • 谢谢。我没想到这可能是 Android 11 上的问题。
  • @Zaid Mirza,在 Android 11 和 12 上没有问题。
  • @blackapps,在实现活动结果 API 后,一切正常。否则,当我选择一个文档时,我会在 OnActvityResult 中获得 RESULT CANCELED。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多