2016-10-03 9 views
0

KitKatからAndroidとSDカードで多くのことを読んでいます。しかし結局、私は明確なグローバルな答えを見つけることができませんでしたので、私は皆さんから関連性の高い回答を得るつもりです。AndroidのSDカードでどこにでも書き込む方法はありますか?

SDカードの任意の場所にファイル、テキストファイルを書きたいと思います。

この簡単な例でAndroid 6に注目しましょう。許可を書く私は、このヘルパーメソッド

private void writeFile(File parent) 
{ 
    try 
    { 
     File f = new File(parent, "test.txt"); 
     OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(f)); 
     outputStreamWriter.write("test"); 
     outputStreamWriter.close(); 
     Log.i(TAG, "File created : " + f.getAbsolutePath()); 
    } 
    catch (IOException e) 
    { 
     Log.e(TAG, "File write failed", e); 
    } 
} 

とテスト活動で持っているマニフェスト

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

に存在している:

if (Build.VERSION.SDK_INT >= 23) 
{ 
    if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED 
     || ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
    { 
     ActivityCompat.requestPermissions(MainActivity.this, new String[] { 
      android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 
      android.Manifest.permission.READ_EXTERNAL_STORAGE }, 1); 
    } 
    else 
    { 
     File path = getExternalFilesDirs(Environment.DIRECTORY_PICTURES)[1]; 
     writeFile(path); 

     path = getExternalFilesDirs(null)[1]; 
     writeFile(path); 

     writeFile(new File("/storage/3635-3533/")); 
    } 
} 

/\ 第三の試験のためにはいパスを! SDカードのパスを正しく取得してハードコードされている場合は、ここでは対象外です /!\

まず打ち上げ、permission asked、すべてがOKです(申し訳ありませんがフランス語デバイス)

第二に打ち上げは、ここで結果

10-03 12:40:10.414: I/TESTSDCARD(26006): File created : /storage/3635-3533/Android/data/com.example.testsdcard/files/Pictures/test.txt 
10-03 12:40:10.415: I/TESTSDCARD(26006): File created : /storage/3635-3533/Android/data/com.example.testsdcard/files/test.txt 
10-03 12:40:10.426: E/TESTSDCARD(26006): File write failed 
10-03 12:40:10.426: E/TESTSDCARD(26006): java.io.FileNotFoundException: /storage/3635-3533/test.txt: open failed: EACCES (Permission denied) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at libcore.io.IoBridge.open(IoBridge.java:459) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at java.io.FileOutputStream.<init>(FileOutputStream.java:72) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at com.example.testsdcard.MainActivity.writeFile(MainActivity.java:61) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at com.example.testsdcard.MainActivity.onCreate(MainActivity.java:50) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.app.Activity.performCreate(Activity.java:6367) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2397) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2504) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.app.ActivityThread.access$900(ActivityThread.java:165) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.os.Handler.dispatchMessage(Handler.java:102) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.os.Looper.loop(Looper.java:150) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at android.app.ActivityThread.main(ActivityThread.java:5546) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at java.lang.reflect.Method.invoke(Native Method) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 
10-03 12:40:10.426: E/TESTSDCARD(26006): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at libcore.io.Posix.open(Native Method) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
10-03 12:40:10.426: E/TESTSDCARD(26006): at libcore.io.IoBridge.open(IoBridge.java:445) 
10-03 12:40:10.426: E/TESTSDCARD(26006): ... 16 more 

あなたが見ることができるように、getExternalFilesDirs作業を使用して、両方のテストは(驚いていないが、それは想定されています) しかし、SDカードのルートに書き込もうとしていた3番目のものが失敗しました。

私は間違っているのですか?このアクションを実行する方法はありますか?うまくいけば、私のアプリケーションのコンテキストで私にとって本当の痛みになるストレージアクセスフレームワークを使用せずに。

さらに、膨大なコードなしで、ストレージアクセスフレームワークでファイルのすべての基本操作(書き込み、削除、名前変更など)を実行できますか?

+0

ルートがないと、 '/ storage'への書き込みアクセス権がありません –

+0

あなたはSDカードを意味しましたか? – ToYonos

+0

まあ、いくつかのデバイスは "SDカード"を持っていないので、ファイルシステム上のパスを意味します。 –

答えて

1

SDカードの任意の場所にファイル、テキストファイルを書きたいと思います。

これは、おそらくルートデバイス以外のAndroid 4.4以降が搭載されている端末では不可能です。

書き込み権限は許可が外部ストレージのためのものであることをマニフェスト

に存在しています。外部ストレージはリムーバブルストレージではありません。

私は間違っていますか?

はい、リムーバブルストレージ上の任意の場所への読み取り/書き込みアクセス権がない限りです。

ストレージアクセスフレームワークでは、膨大なコードを必要とせずにすべての基本操作(ファイルの書き込み、削除、名前変更など)を実行できますか?

「あなたは膨大な量のコード」とはみなされません。一般的に言えば、ユーザーからコンテンツ(またはコンテナ)のパーミッションがある場合は、DocumentFileに表示されている操作の種類を実行できます。

+0

ファイル管理者はルートアクセスなしでこのような操作をどのように実行できますか?彼らはすべてDocumentFileメソッドを使用しましたか? – ToYonos

+0

@ ToYonos:特定のアプリを開発者に尋ねる必要があります。デバイスに同梱されているファイルマネージャは通常、リムーバブルストレージに直接アクセスできることに注意してください。 – CommonsWare

+0

私は 'DocumentFile'でいくつかのテストを行いましたが、ファイルの作成/修正にはうまくいきます。私はいくつかの深刻なリファクタリングが期待されていると思います:) – ToYonos

関連する問題