2015-10-11 10 views
8

アプリはAndroid 6.0の外部ストレージに書き込めません(私はエミュレータでテストしています)。アプリが強制終了されて再起動されない限り実行時にWRITE_EXTERNAL_STORAGEが付与された後であっても、許可を付与してからアプリが再起動されない限り、外部ストレージに書き込むことはできません。

のAndroidManifest.xml

からスニペット

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.1" 

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

build.gradle

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

私は(バックアップ用)外部ストレージに書き込むために必要があるとき、私は私が権限を持っているかどうかを確認してください。

  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()); 
      } 

は、私はまた、場合

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()); 

が許可した後、

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) 

を生成し、次の

許可がユーザーによって付与され
@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(); 
      } 
     } 
    } 

、次のコードを持っていますapp iが付与されているすべてが完璧になり、バックアップファイルが外部ストレージに作成されます。

私が間違っていることをお勧めします。

+2

これはよく知られているバグです。開発者のプレビューの問題追跡ツールで問題を確認できます。それについては何もできません。 – greywolf82

+1

ポインタのおかげで – YogeshM

答えて

3

権限付与を正常に確認した後、onRequestPermissionsResult()メソッドに次の行を追加します。

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

編集:あなたがターゲットSDKのバージョンを設定しているチェックあなたが行くことよりも、あなたはすでにそれを行っている、それが動作していない(またはあなたが23に設定する必要はありません)23.ifこの解決策で(アプリケーションプロセスを終了する)。

+1

この方法はAndroidのバグに基づいています。 killProcess()は通常、あなたのアプリを再起動しませんが、特定の状況(具体的には、あなたのアプリが新しくインストールされたとき)には、前述のバグのために発生する可能性があります。これを見てください:http://stackoverflow.com/questions/11726100/why-would-application-sometimes-restart-on-killprocess – Carl

-1

新しいデバイスをエミュレートしようとします(たとえば、Google APIを使用して6.0 x86_64)。私はまったく同じ問題を抱えていて、別のエミュレータで実行することで解決しました。

関連する問題