Hallo zusammen,
ich bin ganz neu hier und hoffe in den richtigen Bereich gepostet zu haben
Zu meiner Problematik, bei der ich hoffe ihr könnt mir meinen Fehler aufzeigen.
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.test.dateiverschieben"
minSdkVersion 24
targetSdkVersion 29
Ich teste auf Android 9 und 10 (Hardware: Samsung S8 und S9).
In Android Studio 3.5.3 versuche ich mich momentan daran in einer kleinen TestApp eine Datei
von meiner SD Card zu verschieben. Bevor ich meinen Code dazu poste vorab die Fehlermeldung:
java.nio.file.AccessDeniedException: /storage/9C33-6BBD/DCIM/Camera/20200521_232157.jpg -> /storage/9C33-6BBD/Android/data/com.test.dateiverschieben/files/20200521_232157.jpg
at sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:457)
at sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:262)
at java.nio.file.Files.move(Files.java:1395)
at com.test.dateiverschieben.MainActivity.xmoveFile(MainActivity.java:815)
at com.test.dateiverschieben.MainActivity.onActivityResult(MainActivity.java:661)
at android.app.Activity.dispatchActivityResult(Activity.java:8292)
at android.app.ActivityThread.deliverResults(ActivityThread.java:5136)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:5184)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7857)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)
Alles anzeigen
Die betreffende Stelle im Code ist beim verschieben der Datei:
private boolean xmoveFile(String sourcePath, String targetPath) {
boolean fileMoved = true;
try {
Files.move(Paths.get(sourcePath), Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
fileMoved = false;
Log.e(TAG,"movefehler",e);
}
return fileMoved;
}
Alles anzeigen
Der Quellpfad und der Zielpfad werden wie folgt ausgewiesen:
/storage/9C33-6BBD/DCIM/Camera/20200521_232157.jpg -> /storage/9C33-6BBD/Android/data/com.test.dateiverschieben/files/20200521_232157.jpg
Ich habe folgendes in der Manifest stehen:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.dateiverschieben">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:requestLegacyExternalStorage="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Alles anzeigen
Mein Code zum Abfragen der Rechte und anfordern selbiger lautet (und meldet, dass die Rechte zum lesen und schreiben gesetzt sind):
//Aufruf
boolean sdcardleserecht = false;
boolean sdcardschreibrecht = false;
if(isReadStorageAllowed()){
//If permission is already having then showing the toast
Toast.makeText(getApplicationContext(),"Recht auf Write External Storage bereits erteilt.",Toast.LENGTH_LONG).show();
//Existing the method with return
return;
}else{
requestStoragePermission();
}
//Prüfung ob Rechte für Lesen und Schreiben bereits gesetzt
private boolean isReadStorageAllowed() {
//Getting the permission status
int result = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
//If permission is granted returning true
if (result == PackageManager.PERMISSION_GRANTED)
return true;
//If permission is not granted returning false
return false;
}
//Requesting permission
private void requestStoragePermission(){
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
//If the user has denied the permission previously your code will come to this block
//Here you can explain why you need this permission
//Explain here why you need this permission
}
//And finally ask for the permission
ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},12345);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 12345: // 12345 oben als storage angegeben
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission is granted. Continue the action or workflow
// in your app.
Toast.makeText(getApplicationContext(), "sdcard schreibenr wurde erlaubt", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "sdcard schreibenr wurde NICHT erlaubt", Toast.LENGTH_LONG).show();
// Explain to the user that the feature is unavailable because
// the features requires a permission that the user has denied.
// At the same time, respect the user's decision. Don't link to
// system settings in an effort to convince the user to change
// their decision.
}
return;
}
// Other 'case' lines to check for other
// permissions this app might request.
}
Alles anzeigen