gpt4 book ai didi

java - 为什么我的应用程序在手机重启后尝试打开文件时崩溃?

转载 作者:太空宇宙 更新时间:2023-11-04 09:02:54 25 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序从用户接收文件并将 URI 插入 SQLite 数据库:

    public void getBook(){                     // called when the user wants to give a file to the app
Intent chooseFile = new Intent(Intent.ACTION_OPEN_DOCUMENT);
chooseFile.setType("text/plain");
chooseFile = Intent.createChooser(chooseFile, "Choose a file");
startActivityForResult(chooseFile, FILE_CHOOSER_REQUEST_CODE);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FILE_CHOOSER_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
Uri u = data.getData();
addBook(u); // addBook adds u.toString() to the db
}
}

我的应用程序使用以下代码来读取文件(它通过对数据库中的字符串使用 Uri.parse() 来获取 u):

    private void readFile(Uri u, String lang, String name){
try {
InputStream is = getContentResolver().openInputStream(u); //the code crashes on this line
\\ some code...
}
catch(java.io.IOException e){
Toast.makeText(MainActivity.this, R.string.file_not_found, Toast.LENGTH_SHORT).show();
}
}

即使我重新打开应用程序,它也能正常工作,但在手机重新启动后,我收到以下错误:

2020-03-06 11:31:49.687 5664-5664/com.example.android.readme E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.readme, PID: 5664
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.downloads.DownloadStorageProvider from ProcessRecord{93bfa52 5664:com.example.android.readme/u0a163} (pid=5664, uid=10163) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
at android.os.Parcel.readException(Parcel.java:2013)
at android.os.Parcel.readException(Parcel.java:1959)
at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:4758)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:5836)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2526)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1780)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1394)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1247)
at android.content.ContentResolver.openInputStream(ContentResolver.java:967)
at com.example.android.readme.MainActivity.readFile(MainActivity.java:162)
at com.example.android.readme.MainActivity.access$300(MainActivity.java:25)
at com.example.android.readme.MainActivity$1.onItemClick(MainActivity.java:84)
at android.widget.AdapterView.performItemClick(AdapterView.java:318)
at android.widget.AbsListView.performItemClick(AbsListView.java:1158)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3127)
at android.widget.AbsListView$3.run(AbsListView.java:4042)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

为什么会发生这种情况? (我确实在代码中使用了 ACTION_OPEN_DOCUMENT。)

预先感谢您的帮助!

最佳答案

addBook(u);   // addBook adds u.toString() to the db

默认情况下,您访问由 Uri 标识的内容的权限仅限于通过 onActivityResult() 指定 Uri 的 Activity 实例。特别是,当您的流程消失时,您的权利就会消失。

如果您要保留来自 ACTION_OPEN_DOCUMENTUri 并尝试在第二天/周/月/年再次使用该 Uri,则需要先在 ContentResolver 上调用 takePersistableUriPermission(),然后再将 Uri 保存到数据库。

关于java - 为什么我的应用程序在手机重启后尝试打开文件时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60561596/

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