2016-09-23 3 views
0

저장소 액세스 프레임 워크를 사용하여 파일을 삭제하려고 시도하지만 deleteDocument는 항상 false를 반환합니다. 나는 안드로이드 5.0을 가진 Asus zenfone 5를 가지고있다 나는 contentprovider와 uri가 맞는지 아닌지 궁금하다. URI는 문제는 당신이 Uri.parse을 사용한다는 것입니다 SDCard에 (/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을 (를) 사용하여 문서를 선택하게합니까? 그리고 그 후에 당신은 의도 된 데이터를 던져 버리므로 선택된 URL을 버리고 파일 경로를 사용하고 그 파일 경로에서 DocumentFile을 만들려고합니까? 모든 것이 말이되지 않습니다. 선택한 URL을 대신 사용해야합니다. 'test == null' 왜'NullPointerException'을 가지고 있는지 궁금해 할 때. – greenapps

+0

또한'ACTION_OPEN_DOCUMENT_TREE'을 사용하면 '디렉토리'트리를 선택할 것입니다.'tag를 사용하여'storage-access-framework' 태그를 읽는 것이 좋습니다. – greenapps

+0

난 그냥 전체 SD 카드에서 오른쪽 삭제 싶어요. 그런 다음 원하는 파일을 삭제하려고합니다. 가능한가? –

답변

0

에서 예외입니다 (t) SAF는 자체 문서 어드레싱 시스템을 가지고 있습니다. 사용자 정의 매핑을 수행하지 않는 한 파일 경로를 SAF 트리에 매핑 할 수 없습니다.

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을 통과하고 아이들이 URI DocumentsContract.BuildChildDocumentsUriUsingTree 및 ContentResolver.Query를 사용하여 얻을 필요가 : 여기

는 자 마린의 코드입니다.