2016-09-23 106 views
0

我只是尝试使用存储访问框架删除文件,但deleteDocument始终返回false。我有一个Android 5.0的华硕zenfone 5 我只是想知道contentprovider和uri是否正确。 URI是从SD卡(/storage/MicroSD/test123123.apk)的路径存储访问框架deleteDocument

String t = ""; 
void deleteFunc(String filepath) { 
    t = filepath; 
    Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT_TREE"); 
    intent.putExtra("android.content.extra.SHOW_ADVANCED", true); 
     startActivityForResult(intent, 1); 
} 



@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    Toast.makeText(this, "S: " + data.getData(), Toast.LENGTH_SHORT).show(); 
    Toast.makeText(this, "D: " + t, Toast.LENGTH_SHORT).show(); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      DocumentFile test = DocumentFile.fromFile(new File(t)); 

      DocumentsContract.deleteDocument(getApplicationContext().getContentResolver(), Uri.parse(t)); 
      Toast.makeText(this, "P: " + test.delete(), Toast.LENGTH_SHORT).show(); 
      Toast.makeText(this, "T: " + DocumentsContract.deleteDocument(getApplicationContext().getContentResolver(), Uri.parse(t)), Toast.LENGTH_SHORT).show(); 
      } 
     } 

这是deleteDocument

09-23 11:46:13.054 8216 8216 W Documents: Failed to delete document 
    09-23 11:46:13.054 8216 8216 W Documents: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.ContentProviderClient.call(java.lang.String, java.lang.String, android.os.Bundle)' on a null object reference 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.provider.DocumentsContract.deleteDocument(DocumentsContract.java:987) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.provider.DocumentsContract.deleteDocument(DocumentsContract.java:971) 
    09-23 11:46:13.054 8216 8216 W Documents:  at com.test.example.ResultActivity.onActivityResult(SourceFile:364) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.app.Activity.dispatchActivityResult(Activity.java:6177) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.app.ActivityThread.deliverResults(ActivityThread.java:3551) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3598) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.app.ActivityThread.access$1300(ActivityThread.java:147) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1330) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.os.Handler.dispatchMessage(Handler.java:102) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.os.Looper.loop(Looper.java:135) 
    09-23 11:46:13.054 8216 8216 W Documents:  at android.app.ActivityThread.main(ActivityThread.java:5253) 
    09-23 11:46:13.054 8216 8216 W Documents:  at java.lang.reflect.Method.invoke(Native Method) 
    09-23 11:46:13.054 8216 8216 W Documents:  at java.lang.reflect.Method.invoke(Method.java:372) 
    09-23 11:46:13.054 8216 8216 W Documents:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
    09-23 11:46:13.054 8216 8216 W Documents:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
+0

为什么你让用户用'OPEN_DOCUMENT_TREE'选择文档?然后,你抛出数据意图,因此选择了uri,并使用一些文件路径,并尝试从该文件路径创建一个DocumentFile?一切都没有意义。你应该使用采摘的urii。 'test == null',如果你想知道为什么你有'NullPointerException'。 – greenapps

+0

此外'ACTION_OPEN_DOCUMENT_TREE'你会选择一个'目录'树.'我建议你阅读一些标签为'storage-access-framework'的文章。 – greenapps

+0

我只想在整个SD卡中删除权限。然后,我将删除我想要的任何文件。可能吗 ? –

回答

0

异常的问题是,你使用Uri.parse (t),而SAF有自己的文件寻址系统。除非进行一些自定义映射,否则不能将文件路径映射到SAF树。

这里是Xamarin代码:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) 
    { 
      if (requestCode == SRC_URI_REQUEST_CODE && resultCode == Result.Ok) 
      { 
       var androidUri = data.Data; 
       var storageUri = DocumentsContract.BuildDocumentUriUsingTree(androidUri, DocumentsContract.GetTreeDocumentId(androidUri)); 
      } 
    } 

现在你需要遍历storageUri和使用DocumentsContract.BuildChildDocumentsUriUsingTree和ContentResolver.Query孩子URI得到。