2016-11-07 41 views
0

當從一個文件瀏覽器打開一個文件,我收到了內容方案URI像下面:是否有可能重新使用內容sheme URI

content://com.asus.filemanager.OpenFileProvider/file/sdcard/backups/apps/testfile.apk 

我然後用使用內容解析器使文件的臨時副本如下所示:

File tempFile = getFileFromContentUri(getContext(), mUri, null); 

應用程序處理完tempFile後,該文件被刪除。現在的問題是,我想用下面的代碼將mUri轉發到另一個活動,但是我這樣做時遇到安全異常,所以看起來URI只能使用一次,是這樣嗎?:

 private forwardFile(Uri fileUri) { 
      final Intent installIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE); 
      Uri uri; 
      if (ContentResolver.SCHEME_CONTENT.equals(fileUri.getScheme())) { 
       uri = new Uri.Builder() 
         .path(fileUri.getPath()) 
         .authority(fileUri.getAuthority()) 
         .scheme(ContentResolver.SCHEME_CONTENT) 
         .build(); 
      } 
      installIntent.setData(uri); 
      installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
      context.startActivity(installIntent); 
     } 

是否有可能重用您可以看到的uri或workaorund?我沒有看到我可以處理這個問題的方法,例如我必須刪除臨時文件,但如果我轉發複製的文件而不是原始URI,則不會收到回調,因此我不知道何時刪除複製的文件。

這裏除了我得到:

java.lang.SecurityException: Uid 10165 does not have permission to uri 0 @ content://com.asus.filemanager.OpenFileProvider/file/sdcard/backups/apps/testfile.apk 
+0

'我想轉發mUri'。我沒有看到「mUri」。 – greenapps

+0

'fileUri.getScheme()'。什麼是'fileUri'? – greenapps

+0

'所以看來,該URI只能使用一次'。不,您可以在同一活動中按照自己的喜好經常使用它。看看和谷歌'context.getContentResolver()。takePersistableUriPermission()'用於重新啓動應用程序後使用。將權限轉移到不同的活動是另一回事。 – greenapps

回答

-1

你得到的權限:

content://com.asus.filemanager.OpenFileProvider/file/sdcard/backups/apps/testfile.apk 

難怪你有java.lang.SecurityException:使用一個完全不同的(不存在的)文件:

content://com.asus.filemanager.OpenFileProvider/file/sdcard/Download/testfile.apk 
+0

來吧,日誌只是用另一個文件進行測試 – David

+0

來吧......你不能寫一個體面的帖子?你怎麼敢把答案標記爲否定的! – greenapps

0

只有當提供服務的應用程序定義了持久性許可時,客戶端調用context.getContentResolver()。takePersistableUriPermission()這可能工作,但我也不確定。

相關問題