2017-10-12 4 views
-3

J'ai le code suivant pour demander la lecture, l'autorisation d'écriture pour le stockage externe (partagé) appelé émulé. Maintenant, je veux aussi lire et écrire sur la carte SD. Mais je reçois l'erreur "autorisation refusée" dans les journaux.Comment vérifier et demander la lecture, l'autorisation d'écriture pour la carte SD dans la plate-forme> = 23 d'Android

//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); 
} 

Les journaux de l'erreur sont comme ci-dessous

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) 

Ma question est « si demander les autorisations de stockage pour le stockage externe » également accorder les autorisations pour « carte sd »? Si ce n'est pas le cas, qu'est-ce qui ne va pas dans mon code ou qu'est-ce qui me manque? J'ai besoin d'une solution!

Le code est aussi sous

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

'pour le stockage externe (partagé) appelé émulé. '???? Que voulez-vous dire? Je n'ai jamais vu ça. – greenapps

+0

donc vous voulez dire: carte SD/android// data/com.free/database.db – Dilazak

+0

par externe (partagé) je veux dire le stockage de l'appareil pas de carte SD! – Dilazak

Répondre

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

Même si vous avez toutes les autorisations pour le stockage externe alors encore vous ne serez pas en mesure d'écrire sur la carte micro SD sur ce lieu .

Vous ne pouvez écrire que dans le répertoire spécifique de l'application sur la carte.

Pour trouver ce chemin, utilisez getExternalFilesDirs(). Si vous avez de la chance, c'est l'une des entrées retournées.

Pour vous le chemin ressemblerait

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

Jetez un oeil avec une application de l'explorateur de fichiers. C'est probablement déjà là.

Si vous voulez écrire partout sur la carte, utilisez l'infrastructure d'accès au stockage.

+0

par externe (partagé) je veux dire le périphérique de stockage pas la carte SD. Donc, vous voulez dire que je ne peux pas lire à: carte SD/database.db mais à la place de carte SD/android/data/com.free/database.db ..... est ce que vous vouliez dire .. – Dilazak

+0

i avez vu beaucoup d'applications de sauvegarde des données sur les cartes SD? Je ne suis pas sûr de votre déclaration !! – Dilazak

+0

/storage/8E14-3919 EST la carte SD! Alors, de quoi parlez-vous? – greenapps