首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果没有GrantUriPermission文件,我如何解决Open_Document问题?

如果没有GrantUriPermission文件,我如何解决Open_Document问题?
EN

Stack Overflow用户
提问于 2022-01-20 12:23:22
回答 1查看 366关注 0票数 0

我想在外部PDF查看器中打开一个文件。如果我用"OPEN_DOCUMENT“文件选择器调用该文件,一切都正常。

如果我直接用没有用户对话框的硬编码现有URI调用另一个文件,我就没有权限。

获取以下错误:

代码语言:javascript
复制
 Caused by: java.lang.SecurityException: UID 10153 does not have permission to content://com.android.externalstorage.documents/document/primary%3ANot%2FBar%2Ftest.pdf [user 0]; you could obtain access using ACTION_OPEN_DOCUMENT or related APIs
    at android.os.Parcel.createException(Parcel.java:2071)
    at android.os.Parcel.readException(Parcel.java:2039)
    at android.os.Parcel.readException(Parcel.java:1987)
    at android.app.IActivityManager$Stub$Proxy.grantUriPermission(IActivityManager.java:5748)
    at android.app.ContextImpl.grantUriPermission(ContextImpl.java:1935)
    at android.content.ContextWrapper.grantUriPermission(ContextWrapper.java:805)
    at android.content.ContextWrapper.grantUriPermission(ContextWrapper.java:805)
    at de.temaks.stepbystep.MainActivity.grantPermissions(MainActivity.java:203)
    at de.temaks.stepbystep.MainActivity.oPDF(MainActivity.java:184)
    at de.temaks.stepbystep.MainActivity.my10(MainActivity.java:144)
    at java.lang.reflect.Method.invoke(Native Method) 
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:441) 
    at android.view.View.performClick(View.java:7146) 
    at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) 
    at android.view.View.performClickInternal(View.java:7119) 
    at android.view.View.access$3500(View.java:803) 
    at android.view.View$PerformClick.run(View.java:27533) 
    at android.os.Handler.handleCallback(Handler.java:883) 
    at android.os.Handler.dispatchMessage(Handler.java:100) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7386) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980) 
 Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.uri.UriGrantsManagerService.checkGrantUriPermission(UriGrantsManagerService.java:1174)
    at com.android.server.uri.UriGrantsManagerService.grantUriPermission(UriGrantsManagerService.java:767)
    at com.android.server.uri.UriGrantsManagerService$LocalService.grantUriPermission(UriGrantsManagerService.java:1317)

我尝试用ACTION_OPEN_DOCUMENT_TREE设置文件夹中所有文件的标志:

代码语言:javascript
复制
public void openDirectory(Uri uriToLoad) {
// Choose a directory using the system's file picker.
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);

// Optionally, specify a URI for the directory that should be opened in
// the system file picker when it loads.
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uriToLoad);
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

startActivityForResult(intent, 3333);

}在activityRusult中,尝试为该文件夹中的所有文件设置标志:

代码语言:javascript
复制
            if (requestCode == 3333
            && resultCode == Activity.RESULT_OK) {
        // The result data contains a URI for the document or directory that
        // the user selected.
        Uri uri = null;
        if (resultData != null) {
            uri = resultData.getData();
            // Perform operations on the document using its URI.
            Log.i("Verzeichnis ", "gelesen: "+uri.toString());

            //take persist permission for later use
            getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

            int takeFlags = resultData.getFlags()& (Intent.FLAG_GRANT_READ_URI_PERMISSION
                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            ContentResolver resolver = this.getContentResolver();
            resolver.takePersistableUriPermission(resultData.getData(),takeFlags);
            File directory = new File(path);

            Log.i("directory.exists():   ",String.valueOf(directory.exists()));
            Log.i("directory.canRead():  ",String.valueOf( directory.canRead()));
            Log.i("directory.length():   ",String.valueOf( directory.length()));
 
            /*File[] files = directory.listFiles();
            Log.i("Files", "Size: " + files.length);
            Toast.makeText(this,String.valueOf(files.length) +" 

            String[] theNamesOfFiles = new String[files.length];
            for (int i = 0; i < files.length; i++) {  
                    theNamesOfFiles[i] =  files[i].getName(); 
             }*/

这没有效果,因为错误发生之后仍然是一样的。也许我拿错旗子了?

directory.exists()给出“真”

directory.canRead()给出"false"

我将标志设置为“目录树”。我应该在每个文件上分别设置标志吗?

目前,在测试用例中,我手动构建uri (此uri (文件)位于设置标志的树中)。稍后,我想调用已保存的uri离开数据库。

代码语言:javascript
复制
Uri uri2 = Uri.parse("content://com.android.externalstorage.documents/document/primary%3ANoten_MVP%2FBariton%2F0018_Wiener%20Elan-Bariton.pdf");
oPDF(uri2);

将uri发送到外部应用程序:

代码语言:javascript
复制
    public void oPDF(Uri myUri){
    Uri uri = null;

    uri = myUri;

    uri.getAuthority();

    String mimeType = getContentResolver().getType(uri);

    Log.i("mime Type ", mimeType);

    //this.grantUriPermission(null, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

    Log.i("URI Import",uri.toString());

    String path = uri.getLastPathSegment()  ;//getEncodedPath();
    path = path.substring(path.indexOf(":") + 1);
    Toast.makeText(this, "importiert: " + path, Toast.LENGTH_LONG).show();

    Log.i("READ_REQUEST_CODE 42: "," hier sind die Ergebnisse aus onActivityResult: " );
    Log.i("uri DER: ", uri.toString());

    Intent target = new Intent(Intent.ACTION_VIEW);
    //target.setDataAndType(Uri.parse("content://com.android.externalstorage.documents/document/primary%3A"+ path), "application/pdf");
    target.setDataAndType(uri, "application/pdf");
    target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    //Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    Intent intent = Intent.createChooser(target, "Open PDF using");
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    grantPermissions(this,target,uri,true);
    try {
        startActivity(intent);
    } catch (ActivityNotFoundException e) {
        // Instruct the user to install a PDF reader here, or something
        Toast.makeText(this, "No Applications found to open pdf", Toast.LENGTH_SHORT).show();
    }
}

仍然是同样的错误

由: content://com.android.externalstorage.documents/document/primary%3ANoten_MVP%2FBariton%2F0010_Laridah%20Marsch-Bariton.pdf : UID 10153引起的

不具有对ACTION_OPEN_DOCUMENT用户0的权限;您可以使用ACTION_OPEN_DOCUMENT或相关的API获得访问

如何获得文件夹的所有文件的权限?我能做什么?

EN

回答 1

Stack Overflow用户

发布于 2022-01-20 15:28:45

一旦您看到了ACTION_OPEN_DOCUMENT获得的一些文件,就可以为文件建立一个很好的工具。

但是对于ACTION_OPEN_DOCUMENT,内容提供者(或者OS,告诉我!)还允许您使用uri。还记得他们!

你现在所感受到的:

由: content://com.android.externalstorage.documents/document/primary%3ANot%2FBar%2Ftest.pdf : UID 10153引起的

不具有对ACTION_OPEN_DOCUMENT用户0的权限;您可以使用ACTION_OPEN_DOCUMENT或相关的APIs

获得访问

你还没有得到使用uri的许可。

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

https://stackoverflow.com/questions/70786168

复制
相关文章

相似问题

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