2017-10-12 32 views
-3

我有以下代碼來請求讀取,寫入外部(共享)存儲的權限,稱爲模擬。現在我也想讀取和寫入SD卡。但是我在日誌中收到錯誤「權限被拒絕」。如何檢查和請求平臺> = 23平臺上的sd卡的讀取和寫入權限

//We are calling this method to check the read permission status 
public boolean isReadWriteStorageAllowed() { 
    //Getting the permission status 
    int resultRead = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); 
    int resultWrite = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

    //If permission is granted returning true 
    if (resultRead == PackageManager.PERMISSION_GRANTED && resultWrite == PackageManager.PERMISSION_GRANTED) 
     return true; 

    //If permission is not granted returning false 
    return false; 
} 

public void requestStoragePermission(int code){ 

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
    } 
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, code); 
} 

的錯誤日誌如下

10-12 14:23:03.998 8550-8550/com.free W/System.err: java.io.FileNotFoundException: /storage/8E14-3919/database.db (Permission denied) 
10-12 14:23:03.998 8550-8550/com.free W/System.err:  at java.io.FileOutputStream.open(Native Method) 
10-12 14:23:03.998 8550-8550/com.free W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:221) 
10-12 14:23:03.998 8550-8550/com. free W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:108) 
10-12 14:23:03.998 8550-8550/com.free W/System.err:  at com. DatabaseManage.exportDatabase(DatabaseManage.java:140) 
10-12 14:23:03.998 8550-8550/com.free W/System.err:  at com. DatabaseManage.access$000(DatabaseManage.java:50) 
10-12 14:23:03.998 8550-8550/com.free W/System.err:  at com. DatabaseManage$1.onClick(DatabaseManage.java:106) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1244) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at android.widget.AdapterView.performItemClick(AdapterView.java:339) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at android.widget.AbsListView.performItemClick(AbsListView.java:1695) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at android.widget.AbsListView$PerformClick.run(AbsListView.java:4171) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at android.widget.AbsListView$13.run(AbsListView.java:6772) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at android.os.Handler.handleCallback(Handler.java:751) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at android.os.Looper.loop(Looper.java:154) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6692) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
10-12 14:23:03.999 8550-8550/com.free W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 

我的問題是「如果要求存儲在外部存儲權限」也將授予「SD卡」的權限?如果沒有,那麼我的代碼有什麼錯誤或我錯過了什麼?我需要一個解決方案!

的代碼是爲下

public void exportDB(){ 
    int size, pathSize = 0; 
    String[] storageLocations = null; 

    final File dbFile = context.getDatabasePath(DATABASE_NAME);//existing database file path 

    File device = Environment.getExternalStorageDirectory();//device storage 
    String[] sdCard = getExternalStorageDirectories();//sd cards 

    size = sdCard.length; 

    if(size == 0) 
     pathSize = 0; 
    else if(size > 0) 
     pathSize = size + 1; 

    pathForExports = new String[pathSize]; 
    storageLocations = new String[pathSize]; 

    if(sdCard.length == 0){ 
     pathForExports[0] = device.getAbsolutePath() + "/" + DATABASE_NAME; 
     storageLocations[0] = "1) Device Storage"; 
    } 
    else if(sdCard.length > 0) { 
     pathForExports[0] = device.getAbsolutePath() + "/" + DATABASE_NAME; 
     storageLocations[0] = "1) Device Storage"; 

     for (int i=0;i<sdCard.length; i++) { 
      File file = new File(sdCard[i]); 
      pathForExports[i+1] = file.getAbsolutePath() + "/" + DATABASE_NAME; 
      if(sdCard.length > 1) { 
       storageLocations[i+1] = (i+2) + ") Sd Card - " + (i+1); 
      } 
      else 
       storageLocations[i+1] = (i+2) + ") Sd Card"; 
     } 
    } 
    //File file = new File(Environment.getExternalStorageDirectory() + File.separator + SAMPLE_DB_NAME); 

    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setTitle("Choose Export Location"); 
    builder.setItems(pathForExports, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      exportDatabase(dbFile, which); 
     } 
    }); 
    AlertDialog alertDialog = builder.create(); 
    alertDialog.show(); 
} 

private void exportDatabase(File dbFile, int whichButton) { 

    FileChannel source = null; 
    FileChannel destination = null; 

    try { 
     source = new FileInputStream(dbFile).getChannel(); 
     destination = new FileOutputStream(pathForExports[whichButton]).getChannel(); 
     destination.transferFrom(source, 0, source.size()); 
     source.close(); 
     destination.close(); 

     if(whichButton == 0) 
      alert("Database is exported to device storage"); 
     else 
      alert("Database is exported to sd Card"); 
    } catch(IOException e) { 
     e.printStackTrace(); 
     if(whichButton == 0) 
      alert("Failed to export database to device storage"); 
     else 
      alert("Failed to export database to sd card"); 
    } 
} 
+0

'外部(共享)存儲稱爲模擬。 '?你什麼意思?從未見過這樣的。 – greenapps

+0

所以你的意思是說:SD卡/安卓//數據/ com.free/database.db – Dilazak

+0

由外部(共享)我的意思是設備存儲不是SD卡! – Dilazak

回答

0
/storage/8E14-3919/database.db . 

即使你有外部存儲的所有權限,然後你仍然不能夠在那個地方的micro SD卡上寫。

您只能在卡上的應用程序特定目錄中寫入。

要找到該路徑,請使用getExternalFilesDirs()。如果幸運的話,這是返回的條目之一。

爲你的路徑看起來像

/storage/8E14-3919/Android/data/<packagename>/files 

有一個文件瀏覽器應用程序看看。它可能已經在那裏。

如果要在卡上的任何地方寫入,請使用存儲訪問框架。

+0

由外部(共享)我的意思是devicez存儲不是SD卡。所以你的意思是說,我不能讀取:SD卡/ database.db,而是SD卡/ android/data/com.free/database.db .....就是你想說的.. – Dilazak

+0

我已經看到很多應用程序支持SD卡的數據?我不確定你的陳述! – Dilazak

+0

/storage/8E14-3919是sd卡!那麼你在說什麼? – greenapps