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");
}
}
'pour le stockage externe (partagé) appelé émulé. '???? Que voulez-vous dire? Je n'ai jamais vu ça. – greenapps
donc vous voulez dire: carte SD/android// data/com.free/database.db – Dilazak
par externe (partagé) je veux dire le stockage de l'appareil pas de carte SD! – Dilazak