2017-10-12 34 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