2016-08-15 2 views
0

In meiner App kann der Benutzer Screenshots und Dateien in seinem externen Speicher speichern. Aber was soll ich tun, wenn der externe Speicher nicht beschreibbar ist? Ich hatte dieses Problem, wenn ich mein Gerät von Lollipop zu Marshmallow aktualisiere. Die SD-Karte wurde von meiner App nicht erkannt, als ich versuchte, einen Screenshot zu speichern. Aber es war zugänglich durch ES Filex Explorer aber READ-ONLY! Sollte es einen Teil des internen Speichers geben, der auf jedem Gerät als "externer" Speicher reserviert ist? Warum hat das nicht funktioniert?Android External Storage Handle Nichtverfügbarkeit

P.S. Der Code funktioniert gut, wenn externer Speicher schreibbar ist!

Das ist mein Code:

Bitmap bitmap = getScreenshotFromRecyclerView(recyclerView); 
     File file = storeImage(bitmap, name); 
     if(file != null){ 
      Toast.makeText(this, getString(R.string.screenshotSaved, name), Toast.LENGTH_LONG).show(); 
      Intent intent = new Intent(); 
      intent.setAction(Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.parse(file.toURI().toString()), "image/*"); 
      startActivity(intent); 
     }else{ 
      Toast.makeText(this, getString(R.string.notAvailable), Toast.LENGTH_LONG).show(); 
     } 



    private File storeImage(Bitmap image, String name) { 
      File pictureFile = getOutputMediaFile(name); 
      if (pictureFile == null) { 
       System.out.println("Error A"); 
      }else{ 
       try { 
        FileOutputStream fos = new FileOutputStream(pictureFile); 
        image.compress(Bitmap.CompressFormat.PNG, 90, fos); 
        fos.close(); 
       } catch (FileNotFoundException e) { 
        System.out.println("Error B"); 
       } catch (IOException e) { 
        System.out.println("Error C"); 
       } 
      } 

      return pictureFile; 
     } 

private File getOutputMediaFile(String name){ 
     File mediaStorageDir = new File(new Helper(this).getPathToAppFolder()); 

     // Create the storage directory if it does not exist 
     if (! mediaStorageDir.exists()){ 
      if (! mediaStorageDir.mkdirs()){ 
       return null; 
      } 
     } 
     // Create a media file name# 
     File mediaFile; 
     if(!name.equals(getString(R.string.training))){ 
      String timeStamp = new SimpleDateFormat("dd.MM.yyyy_HH:mm", Locale.getDefault()).format(new Date()); 
      String mImageName= name + "_" + timeStamp + ".jpg"; 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName); 
     }else{ 
      String mImageName= name + ".jpg"; 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName); 
     } 

     return mediaFile; 
    } 
+0

Jedes Gerät verfügt über externen Speicher. Und jede App kann mit der in Manifest angeforderten Berechtigung zum Schreiben externer Speicher schreiben. Wenn Sie eine Micro-SD-Karte hinzufügen, ist auf diesem Wechselspeicher meist kein Schreiben möglich. Es ist unklar, wo du sprichst. – greenapps

+0

'Benutzer kann Screenshots und Dateien in seinem externen Speicher speichern '. Ist es? Niemand kann deinen Code überprüfen, da wir nicht wissen, was 'new Helper (this) .getPathToAppFolder()' liefert. – greenapps

+0

Es funktionierte gut auf Lutscher. public String getPathToAppFolder() { Rückgabe Environment.getExternalStorageDirectory() + "/ Android/data /" + context.getPackageName() + "/ Files /"; } – XxGoliathusxX

Antwort

1

Sie müssen für Berechtigungen Eibisch Stil fragen, siehe hier für mehr: https://guides.codepath.com/android/Understanding-App-Permissions#permission-updates-in-marshmallow

Vor Datei speichern Operationen ausgeführt werden Sie, wenn die Berechtigungen müssen prüfen wird akzeptiert, wenn nicht, entscheiden Sie, was sinnvoll ist, damit Ihre App einen "anmutigen" Fehler hat.

+0

Muss ich jemanden oder immer fragen? – XxGoliathusxX

+0

Immer ist der richtige Weg. Benutzer können die Berechtigung jederzeit widerrufen, sodass Sie in der Lage sein müssen, diese zu behandeln, um mit Berechtigungen verbundene Abstürze zu vermeiden. –

+0

danke. Es funktioniert jetzt! – XxGoliathusxX

1

Aus dem Marshmallow müssen Sie dem Benutzer manuell die Erlaubnis zum Schreiben/Lesen des Telefonspeichers geben.

siehe dieses Beispiel oder verwenden Sie diese example, um Erlaubnis manuell zu fragen.