1

當使用Intent.ACTION_GET_CONTENT列出與Android系統的文件選擇器中的文件,使用Intent.ACTION_GET_CONTENT時如何避免Android操作系統5.11(也許其他操作系統也一樣),「拋出:SecurityException」

Intent openIntent = new Intent(Intent.ACTION_GET_CONTENT); 
openIntent.addCategory(Intent.CATEGORY_OPENABLE); 
openIntent.setType("*/*"); 
startActivityForResult(openIntent, ANDROID_FILE_PICKER); 

和無效onActivityResult()它得到拋出:SecurityException:

「權限拒絕:開放商com.google.android.apps.docs.storagebackend.StorageBackendContentProvider ......需要android.permission.MANAGE_DOCUMENTS」

周圍的工作了例外是:

Intent openIntent = new Intent(Intent.ACTION_GET_CONTENT); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     openIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
     openIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    } 
    openIntent.addCategory(Intent.CATEGORY_OPENABLE); 
    openIntent.setType("*/*"); 
    startActivityForResult(openIntent, ANDROID_FILE_PICKER); 

和onActivityResult(),這樣做:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    int takeFlags = data.getFlags(); 
    takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    getContentResolver().takePersistableUriPermission(uri, takeFlags); 

它解決了權限問題。

但更糟糕的是,從使用Intent.ACTION_GET_CONTENT到Intent.ACTION_OPEN_DOCUMENT變化導致Android的系統文件選擇菜單不顯示的內容提供商,像Dropbox的,照片等

(如指出,在Who to show more providers with ACTION_OPEN_DOCUMENT)。

所以問題是如果它必須列出Dropbox等與使用Intent.ACTION_GET_CONTENT,但如何避免獲取SecurityException?

+0

更多代碼請。您的onActivityResult在GET_CONTENT中的外觀如何?你在InputStream中得到的執行函數 – AChez9

+0

inputStream = context.getContentResolver()。openInputStream(uri); – lannyf

+0

我有同樣的問題,你解決了嗎? –

回答

0

似乎這個作品。必須有更好的解決方案,如果有人知道:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
          try { 
           this.grantUriPermission(this.getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 
          } catch(IllegalArgumentException e) { 
           this.grantUriPermission(this.getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); // kikat api only 0x3 are allowed FLAG_GRANT_READ_URI_PERMISSION = 1 | FLAG_GRANT_WRITE_URI_PERMISSION = 2; 
          } catch (SecurityException e) { 

          } 

          int takeFlags = data.getFlags(); 
          takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION 
            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

          try { 
           getContentResolver().takePersistableUriPermission(uri, takeFlags); 
          } catch (SecurityException e) { 
           // ignore 
          } 
相關問題