2016-09-05 20 views
0

この問題のデバッグには本当にうんざりです。私はストレージに書き込むアプリケーションを持っています。私はAndroidのバージョンが6.0.1になっています。アップデートがあるまで、アプリケーションは正常に動作しました(私はAndroidの開発からの休憩があったため、どのアップデートが原因か分かりません)。Androidのストレージ権限書き込みのみ?

とにかく、私は外部ストレージに書き込もうとしています。私は、Androidのための新たな許可制度を読んで準備許可を得た、と私は私のコードのチェックをしていました:私がチェックしたデバッグでは

checkSelfPermission("android.permission.READ_EXTERNAL_STORAGE") 
checkSelfPermission("android.permission.WRITE_EXTERNAL_STORAGE") 

(私もチェックし、許可かどうかを確認するコードを取得します必要ですが、私はそれが本当にあることを確認したかった;))私はに等しい、彼らは値0を返すことを観察してきたので、

をPackageManager.PERMISSION_GRANTED、権限が確実に付与されます。私はストレージのAppディレクトリを作成して、pdfファイルを作成し、sqlite DBを格納し、そのようなものを作成しようとしています。

String state = Environment.getExternalStorageState(); 

    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     // We can read and write the media 
     File dir = Environment.getExternalStorageDirectory(); 
     String sNewDir = Constants.ApplicationDataDir; 

     if (sSubDir == null) { 
      sSubDir = ""; 
     } else { 
      sSubDir = sSubDir.trim(); 
     } 
     if (sSubDir.length() > 0) { 
      sNewDir += File.separator + sSubDir; 
     } 
     File dirName = new File(dir, sNewDir); 
     if (!dirName.exists()) { 
      if (!dirName.mkdirs()) { 
       LogDump.e("getAppDirectory err", " (sSubDir=<" + sSubDir + "> cannot create dir: " + dirName.getAbsolutePath()); 
      } 
     } 
     return dirName; 
    } else { 
     // Something else is wrong 
     LogDump.e("getAppDirectory err", " (sSubDir=<" + sSubDir + "> not mounted state: " + state); 
     return null; 
    } 

dirNameにの価値がある/ストレージ/エミュレート/ 0/MY_APP_CONST_VALUE/sSubDir(。sSubdirは、サブディレクトリIE用のパラメータである "環境設定") スヨン:ここ

は、私はディレクトリを作成する方法です、コード(デバッガでチェックする)はディレクトリが存在しないことをチェックし、mkdirs()は結果をfalseに返します。実際には、ディレクトリが存在せず、作成できないことを意味します。これは、それが作成することはできませんので、非常に論理的と思われる

... SQLLiteコード そしてほかのファイル操作のためにFileNotFound例外から

W/FileUtils: Failed to chmod(/storage/emulated/0/MY_APP_CONST_VALUE/DB/pcdrdata.sqlite3): android.system.ErrnoException: chmod failed: EPERM (Operation not permitted) 

:私のアプリケーションの動作中

私のログがで満たされますディレクトリ、右? ここで最も紛らわしい部分は

私は総司令官を使用していますが、実際にディレクトリが作成され、sqliteデータベースがコピーされ、FileNotFoundExceptionを行うすべてのファイルがそこにあることがわかります。私はテストを行い、それらを削除し、アプリケーションを再実行し、それらは再度場所にコピーされます。ただし、ファイルに対する読み取り操作はできません。

それで何とかディレクトリを作成し、それ以外の場合はmkdirs()でも書き込むことができますが、読み込みはできません。

私は本当に混乱しており、試練に疲れています。私はまた、SDカードなしで同じことを試してみました - 同じ結果にかかわらず、.....

を私のアプリケーションは、PDFファイルを作成する - 彼らは成功した作成されますが、それでも総司令官はそれがそれらを開くことができないと言われ....

私の携帯電話はXperia Z3

+0

IDEから新しいバージョンを実行するだけでなく、 。 – CommonsWare

+0

FWIW、あなたのコードを 'targetSdkVersion'が22、WRITE_EXTERNAL_STORAGEがマニフェストにあるスクラップアプリケーションに入れました。Android 6.0.1を実行しているNexus 5Xでうまくいきました。 – CommonsWare

答えて

0

現在、外部ストレージのルートから読み取ることはできません。あなたは特別なパブリックディレクトリまたはsdcardの自分のプライベートディレクトリでのみ読むことができます。作成しても変更できない場合は、アンドロイドがそこに書き込むことができると判断しましたが、そこには書き込めないと判断しました。

+0

私はgetExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)も試みましたが、結果は同じでした。 アプリデータをどこに保存すればよいですか?私はそれが正常に働いていることを100%確信していますKitKat – maslan

+0

[外部ストレージ](https://commonsware.com/blog/2014/04/08/storage-situation-external-storage.html)は[リムーバブルストレージ]ではありません(https ://commonsware.com/blog/2014/04/09/storage-situation-removable-storage.html)。 'READ_EXTERNAL_STORAGE'(デバイスと' targetSdkVersion'に応じて実行時パーミッションを含む)を保持していれば、外部ストレージのルート( 'Environment.getExternalStorageDirectory()')から問題なく読むことができます。 – CommonsWare

+0

@CommonsWareなので、なぜそれを読むことができないのですか?私はパーミッションを保持しており、getExternalStorageDirectoryを使用しても動作しません。 奇妙なAndroid Device Monitorで/ storage/emulated/0を開くこともできません – maslan

関連する問題