File.move mit Berechtigung auf SD Card wirft java.nio.file.AccessDeniedException

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • File.move mit Berechtigung auf SD Card wirft java.nio.file.AccessDeniedException

    Neu

    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:

    Quellcode

    1. java.nio.file.AccessDeniedException: /storage/9C33-6BBD/DCIM/Camera/20200521_232157.jpg -> /storage/9C33-6BBD/Android/data/com.test.dateiverschieben/files/20200521_232157.jpg
    2. at sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:457)
    3. at sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:262)
    4. at java.nio.file.Files.move(Files.java:1395)
    5. at com.test.dateiverschieben.MainActivity.xmoveFile(MainActivity.java:815)
    6. at com.test.dateiverschieben.MainActivity.onActivityResult(MainActivity.java:661)
    7. at android.app.Activity.dispatchActivityResult(Activity.java:8292)
    8. at android.app.ActivityThread.deliverResults(ActivityThread.java:5136)
    9. at android.app.ActivityThread.handleSendResult(ActivityThread.java:5184)
    10. at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
    11. at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    12. at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    13. at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175)
    14. at android.os.Handler.dispatchMessage(Handler.java:107)
    15. at android.os.Looper.loop(Looper.java:237)
    16. at android.app.ActivityThread.main(ActivityThread.java:7857)
    17. at java.lang.reflect.Method.invoke(Native Method)
    18. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    19. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)
    Alles anzeigen


    Die betreffende Stelle im Code ist beim verschieben der Datei:


    Quellcode

    1. private boolean xmoveFile(String sourcePath, String targetPath) {
    2. boolean fileMoved = true;
    3. try {
    4. Files.move(Paths.get(sourcePath), Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);
    5. } catch (Exception e) {
    6. fileMoved = false;
    7. Log.e(TAG,"movefehler",e);
    8. }
    9. return fileMoved;
    10. }
    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-Quellcode: AndroidManifest.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    3. package="com.test.dateiverschieben">
    4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    5. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    6. <application
    7. android:requestLegacyExternalStorage="true"
    8. android:allowBackup="true"
    9. android:icon="@mipmap/ic_launcher"
    10. android:label="@string/app_name"
    11. android:roundIcon="@mipmap/ic_launcher_round"
    12. android:supportsRtl="true"
    13. android:theme="@style/AppTheme">
    14. <activity android:name=".MainActivity">
    15. <intent-filter>
    16. <action android:name="android.intent.action.MAIN" />
    17. <category android:name="android.intent.category.LAUNCHER" />
    18. </intent-filter>
    19. </activity>
    20. </application>
    21. </manifest>
    Alles anzeigen


    Mein Code zum Abfragen der Rechte und anfordern selbiger lautet (und meldet, dass die Rechte zum lesen und schreiben gesetzt sind):

    Quellcode

    1. //Aufruf
    2. boolean sdcardleserecht = false;
    3. boolean sdcardschreibrecht = false;
    4. if(isReadStorageAllowed()){
    5. //If permission is already having then showing the toast
    6. Toast.makeText(getApplicationContext(),"Recht auf Write External Storage bereits erteilt.",Toast.LENGTH_LONG).show();
    7. //Existing the method with return
    8. return;
    9. }else{
    10. requestStoragePermission();
    11. }
    12. //Prüfung ob Rechte für Lesen und Schreiben bereits gesetzt
    13. private boolean isReadStorageAllowed() {
    14. //Getting the permission status
    15. int result = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
    16. //If permission is granted returning true
    17. if (result == PackageManager.PERMISSION_GRANTED)
    18. return true;
    19. //If permission is not granted returning false
    20. return false;
    21. }
    22. //Requesting permission
    23. private void requestStoragePermission(){
    24. if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
    25. //If the user has denied the permission previously your code will come to this block
    26. //Here you can explain why you need this permission
    27. //Explain here why you need this permission
    28. }
    29. //And finally ask for the permission
    30. ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},12345);
    31. }
    32. @Override
    33. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    34. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    35. switch (requestCode) {
    36. case 12345: // 12345 oben als storage angegeben
    37. // If request is cancelled, the result arrays are empty.
    38. if (grantResults.length > 0 &&
    39. grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    40. // Permission is granted. Continue the action or workflow
    41. // in your app.
    42. Toast.makeText(getApplicationContext(), "sdcard schreibenr wurde erlaubt", Toast.LENGTH_LONG).show();
    43. } else {
    44. Toast.makeText(getApplicationContext(), "sdcard schreibenr wurde NICHT erlaubt", Toast.LENGTH_LONG).show();
    45. // Explain to the user that the feature is unavailable because
    46. // the features requires a permission that the user has denied.
    47. // At the same time, respect the user's decision. Don't link to
    48. // system settings in an effort to convince the user to change
    49. // their decision.
    50. }
    51. return;
    52. }
    53. // Other 'case' lines to check for other
    54. // permissions this app might request.
    55. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Jens Hasborg ()