由于在Android11,SDK 30上所做的存储访问更改,我更改了保存PDF文件和图像的路径。
以前,我用过这个:
File file = new File(Environment.getExternalStorageDirectory() + "/" + folderName + "/" + fileName);以下是文件提供程序:
<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:
<paths>
<external-path name="external_files" path="myFolder/"/>
<files-path name="files" path="docs/" />
</paths>现在,我改变了这条道路:
File file = new File(context.getExternalFilesDir(null) + "/" + folderName + "/" + fileName);PDF文件和图像保存成功。
但是当我尝试在应用程序中共享来自我的PDFView的PDF时,应用程序就会在FileProvider.getUriForFile(...)上崩溃。在我改道之前一切都很顺利。
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的名字”
我已经多次更改了文件提供程序,尝试了许多组合,包括下面的组合(我将所有内容单独放置,而不是一次全部分开),似乎没有任何东西起作用。
<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)
发布于 2021-12-09 16:22:04
下面是Kotlin代码,但是它对我有用,我认为它会帮助您解决问题。
流形
<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
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="."/>
</paths>码
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"))
}
}https://stackoverflow.com/questions/70289765
复制相似问题