首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件提供程序Android 11

文件提供程序Android 11
EN

Stack Overflow用户
提问于 2021-12-09 12:14:48
回答 1查看 450关注 0票数 0

由于在Android11,SDK 30上所做的存储访问更改,我更改了保存PDF文件和图像的路径。

以前,我用过这个:

代码语言:javascript
复制
File file = new File(Environment.getExternalStorageDirectory() + "/" + folderName + "/" + fileName);

以下是文件提供程序:

代码语言:javascript
复制
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">

  <meta-data
      android:name="android.support.FILE_PROVIDER_PATHS"
      android:resource="@xml/provider_paths" />

</provider>

下面是路径更改之前的provider_paths.xml:

代码语言:javascript
复制
<paths>
    <external-path name="external_files" path="myFolder/"/>
    <files-path name="files" path="docs/" />
</paths>

现在,我改变了这条道路:

代码语言:javascript
复制
 File file = new File(context.getExternalFilesDir(null) + "/" + folderName + "/" + fileName);

PDF文件和图像保存成功。

但是当我尝试在应用程序中共享来自我的PDFView的PDF时,应用程序就会在FileProvider.getUriForFile(...)上崩溃。在我改道之前一切都很顺利。

代码语言:javascript
复制
case R.id.action_share:
    Intent intentShare = null;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Uri u=FileProvider.getUriForFile(getBaseActivity(), AUTHORITY, file);
        intentShare = new Intent(Intent.ACTION_SEND);
        intentShare.setType("application/pdf");
        intentShare.putExtra(Intent.EXTRA_STREAM, u);
        intentShare.putExtra(Intent.EXTRA_SUBJECT, "Sharing File...");
        intentShare.putExtra(Intent.EXTRA_TEXT, "Sharing File...");
        intentShare.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        startActivity(intentShare);

    }

getBaseActivity()返回上下文

权威是“package.provider的名字”

我已经多次更改了文件提供程序,尝试了许多组合,包括下面的组合(我将所有内容单独放置,而不是一次全部分开),似乎没有任何东西起作用。

代码语言:javascript
复制
<external-files-path name="external_files" path="." />
<external-files-path name="external_files" path="/" />
<external-files-path name="my_folder" path="myFolder/" />
<external-path name="my_folder" path="Android/data/[name of the package]/files/myFolder" />
<files-path name="files" path="." />
<external-files-path name="external_files" path="." />

我一直犯这个错误,我找不到合适的解决办法,我被困在这里三个星期了.

下面是逻辑代码行:

2021-12-09 15:09:09.771 23495-23495/包名k/AndroidRuntime:致命异常:主进程:包名,PID: 23495 java.lang.IllegalArgumentException:未能找到包含/存储/模拟/0/Android/data/包名/文件/myFolder/879881480803.pdf的配置根,地址为androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418) at hr.asseco.ui.activity.fragment.PdfFragment.onOptionsItemSelected(PdfFragment.java:145) at androidx.fragment.app.Fragment.performOptionsItemSelected(Fragment.java:2733) at androidx.fragment.app.FragmentManagerImpl.dispatchOptionsItemSelected(androidx.fragment.app.FragmentController.dispatchOptionsItemSelected(FragmentController.java:411) at androidx.fragment.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:390) at androidx.appcompat.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:228) at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109) at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109) at androidx.appcompat.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:65) at androidx.appcompat.widget.Toolbar$1.onMenuItemClick(Toolbar在androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:779),androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:834),androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158),androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:985),androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:975),androidx.appcompat.widget.ActionMenuView.invokeItem(ActionMenuView.java:623),androidx.appcompat。view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:151) at android.view.View.performClick(View.java:7161) at android.view.View.performClickInternal(View.java:7138) at android.view.View.access$3500(View.java:811) at android.view.View$PerformClick.run(View.java:27419) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loopandroid.app.ActivityThread.main(ActivityThread.java:7542) at java.lang.reflect.Method.invoke(原生方法) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

EN

回答 1

Stack Overflow用户

发布于 2021-12-09 16:22:04

下面是Kotlin代码,但是它对我有用,我认为它会帮助您解决问题。

流形

代码语言:javascript
复制
<application
        ....
        android:requestLegacyExternalStorage="true">

               <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="com.example.pdf.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths" />
                </provider>
</application>

xml/provider_paths

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

代码语言:javascript
复制
var myPdfFilePath: File? = null
myPdfFilePath= File(checkFolder(), "myPdfFile.pdf") 

private fun checkFolder(): File {

    val root = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {
        File(getExternalFilesDir(null), folderName)
    } else {
        File(Environment.getExternalStorageDirectory(), folderName)
    }

    var isDirectoryCreated: Boolean = root.exists()
    if (!isDirectoryCreated) {
        isDirectoryCreated = root.mkdir()
    }
    Log.d("Folder", "Created ? $isDirectoryCreated")
    return root
}

private fun sharePdfFile() {
        val contentUri: Uri = FileProvider.getUriForFile(
            applicationContext,
            "com.example.pdf.provider",
            myPdfFilePath!!
        )

        if (myPdfFilePath?.exists()!!) {
            val shareIntent = Intent()
            shareIntent.action = Intent.ACTION_SEND
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            shareIntent.setDataAndType(contentUri, contentResolver.getType(contentUri))
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(myPdfFilePath))
            startActivity(Intent.createChooser(shareIntent, "Choose an app"))
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70289765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档