2015-10-11 7 views
8

App konnte nicht auf externen Speicher unter Android 6.0 schreiben (Ich teste auf Emulator), auch nachdem WRITE_EXTERNAL_STORAGE zur Laufzeit gewährt wurde; Es sei denn, die App wird beendet und neu gestartet.Kann nicht in externen Speicher schreiben, wenn die Anwendung nach dem Erteilen der Berechtigung nicht neu gestartet wird

Snippet von AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

build.gradle

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.1" 

defaultConfig { 
    ...... 
    minSdkVersion 15 
    targetSdkVersion 23 
} 

Jedes Mal, wenn ich brauche, um externen Speicher (für Backup) zu schreiben, überprüfe ich, ob ich die Erlaubnis haben.

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && 
        getActivity().getBaseContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
       requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_RW_EXTERNAL_STORAGE); 
       mPendingAction = PendingAction.Backup; 
      } else { 
       BackupRestoreService.startBackup(getActivity().getBaseContext()); 
      } 

Ich habe auch die folgenden

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     Log.d("SettingsActivity", "grantResultsLength: " + grantResults.length); 
     if (requestCode == PERMISSION_REQUEST_RW_EXTERNAL_STORAGE) { 
      Log.d("SettingsActivity", "grantResultsLength: " + grantResults.length); 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       switch (mPendingAction) { 
        case Backup: 
         BackupRestoreService.startBackup(getActivity().getBaseContext()); 
         mPendingAction = PendingAction.None; 
         break; 
        case Restore: 
         break; 
        default: 
       } 

      } else { 
       Toast.makeText(getActivity(), 
         "Permission denied", 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

Wenn die Genehmigung durch den Benutzer, den folgenden Code

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), DIR_MY_PORTFOLIO); 
if (!file.mkdirs()) 
     Log.d("Backup", "Unable to create directories"); 
final String outputFilename = new SimpleDateFormat("'Backup'-yyyyMMdd-hhmmss'.mpb'", Locale.US).format(new Date()); 
File outputFile = new File(getBackupStorageDir(), outputFilename); 
Log.d("Backup", "Can write to file: " + outputFile.canWrite()); 
Log.d("Backup", "File exists: " + outputFile.exists()); 

produziert

in.whoopee.myportfolio D/Backup: Unable to create directories 
    in.whoopee.myportfolio D/Backup: Can write to file: false 
    in.whoopee.myportfolio D/Backup: File exists: false 
    in.whoopee.myportfolio W/System.err: java.io.FileNotFoundException: /storage/09FD-2F0C/Download/My Portfolio/Backup-20151011-051318.mpb: open failed: EACCES (Permission denied) 

Wenn nach der Genehmigung gestattet ist gewährt, die App ich s getötet und neu gestartet, alles läuft perfekt und Sicherungsdatei wird im externen Speicher erstellt.

Bitte schlagen Sie vor, was ich falsch mache.

+2

Es ist ein bekannter Fehler. Sie können das Problem in der Entwicklervorschau-Problemverfolgung anzeigen. Wir können nichts dagegen tun. – greywolf82

+1

Danke für den Zeiger – YogeshM

Antwort

3

Fügen Sie die folgende Zeile in der Methode onRequestPermissionsResult() hinzu, nachdem Sie die Berechtigungszuweisung erfolgreich überprüft haben.

android.os.Process.killProcess(android.os.Process.myPid()); 

Edit: Überprüfen Sie die Ziel sdk Version gesetzt haben 23.Wenn Sie bereits haben getan, und es funktioniert nicht (oder wollen Sie nicht es auf 23 gesetzt), als Sie gehen kann mit dieser Lösung (den App-Prozess beenden).

+1

Dieser Ansatz basiert auf einem Fehler in Android; killProcess() startet Ihre App normalerweise nicht neu, aber unter bestimmten Umständen (insbesondere wenn Ihre App auf einer neuen Installation ausgeführt wird) kann es aufgrund des oben genannten Fehlers dazu kommen. Siehe hierzu: http://stackoverflow.com/questions/11726100/why-would-application-ometimes-restart-on-killprocess – Carl

-1

Versuchen Sie, ein neues Gerät zu emulieren (z. B. ein 6.0 x86_64 mit Google APIs). Ich hatte genau das gleiche Problem und löste es, indem ich auf einem anderen Emulator lief.