我想在外部PDF查看器中打开一个文件。如果我用"OPEN_DOCUMENT“文件选择器调用该文件,一切都正常。
如果我直接用没有用户对话框的硬编码现有URI调用另一个文件,我就没有权限。
获取以下错误:
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设置文件夹中所有文件的标志:
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中,尝试为该文件夹中的所有文件设置标志:
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离开数据库。
Uri uri2 = Uri.parse("content://com.android.externalstorage.documents/document/primary%3ANoten_MVP%2FBariton%2F0018_Wiener%20Elan-Bariton.pdf");
oPDF(uri2);将uri发送到外部应用程序:
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获得访问
如何获得文件夹的所有文件的权限?我能做什么?
发布于 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的许可。
https://stackoverflow.com/questions/70786168
复制相似问题