8

外部 SD カードにファイルを書き込んでいるときに、エラー EACCESS 権限が拒否されました。アクセス許可を設定しました <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> が、ファイルを読み取ると、正常に読み取ることができますが、ファイルに書き込むことはできません。SDカードにファイルを書き込むために使用しているコードは次のとおりです。

String path="mnt/extsd/Test";

                try{
                    File myFile = new File(path, "Hello.txt");              //device.txt
                    myFile.createNewFile();
                    FileOutputStream fOut = new FileOutputStream(myFile);

                    OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
                    myOutWriter.append(txtData.getText());
                    myOutWriter.close();
                    fOut.close();
                    Toast.makeText(getBaseContext(),"Done writing SD "+myFile.getPath(),Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
                    System.out.println("Hello"+e.getMessage());
                }
            }

外部ストレージ カードのパスは ですmnt/extsd/Environment.getExternalStorageDirectory().getAbsolutePath()そのため、パスを提供しているパスを使用できずmnt/sdcard、このパスはタブレットの内部ストレージ パス用です。なぜこれがそうであるかを提案してくださいnどうすればこれを解決できますか

4

4 に答える 4

17

私が覚えているように、Android は Honeycomb 以来、部分的なマルチストレージ サポートを取得しており、プライマリ ストレージ (Environment.getExternalStorageDirectory から取得したもの、通常は内部 eMMC カードの一部) は依然としてアクセス許可によって保護されてWRITE_EXTERNAL_STORAGEいますが、セカンダリ ストレージ (実際のリムーバブル SD カード) は新しいアクセス許可によって保護されてandroid.permission.WRITE_MEDIA_STORAGEおり、保護レベルは signatureOrSystemです。この記事の説明も参照してください。

この場合、通常のアプリがプラットフォーム署名なしで実際の SD カードに何かを書き込むことは不可能に思えます...

于 2012-10-12T07:05:42.667 に答える
7

API レベル 19 から、Google は API を追加しました。

  • Context.getExternalFilesDirs()
  • Context.getExternalCacheDirs()
  • Context.getObbDirs()

アプリは、合成されたアクセス許可で許可されているパッケージ固有のディレクトリを除き、セカンダリ外部ストレージ デバイスへの書き込みを許可してはなりません。このように書き込みを制限すると、アプリケーションのアンインストール時にシステムがファイルをクリーンアップできるようになります。

以下は、絶対パスを使用して外部 SD カード上のアプリケーション固有のディレクトリを取得する方法です。

Context _context = this.getApplicationContext();

File fileList2[] = _context.getExternalFilesDirs(Environment.DIRECTORY_DOWNLOADS);

if(fileList2.length == 1) {
    Log.d(TAG, "external device is not mounted.");
    return;
} else {
    Log.d(TAG, "external device is mounted.");
    File extFile = fileList2[1];
    String absPath = extFile.getAbsolutePath(); 
    Log.d(TAG, "external device download : "+absPath);
    appPath = absPath.split("Download")[0];
    Log.d(TAG, "external device app path: "+appPath);

    File file = new File(appPath, "DemoFile.png");

    try {
        // Very simple code to copy a picture from the application's
        // resource into the external file.  Note that this code does
        // no error checking, and assumes the picture is small (does not
        // try to copy it in chunks).  Note that if external storage is
        // not currently mounted this will silently fail.
        InputStream is = getResources().openRawResource(R.drawable.ic_launcher);
        Log.d(TAG, "file bytes : "+is.available());

        OutputStream os = new FileOutputStream(file);
        byte[] data = new byte[is.available()];
        is.read(data);
        os.write(data);
        is.close();
        os.close();
    } catch (IOException e) {
        // Unable to create file, likely because external storage is
        // not currently mounted.
        Log.d("ExternalStorage", "Error writing " + file, e);
    }
}

上記のログ出力は次のようになります。

context.getExternalFilesDirs() : /storage/extSdCard/Android/data/com.example.remote.services/files/Download

external device is mounted.

external device download : /storage/extSdCard/Android/data/com.example.remote.services/files/Download

external device app path: /storage/extSdCard/Android/data/com.example.remote.services/files/
于 2014-03-05T14:53:17.773 に答える
0

ユーザーが外部ストレージの権限を持っているかどうかを確認します。そうでない場合は、キャッシュ dir を使用してファイルを保存します。

final boolean extStoragePermission = ContextCompat.checkSelfPermission(
               context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED;

            if (extStoragePermission &&
        Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) {
                parentFile = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
            }
            else{
                parentFile = new File(context.getCacheDir(),    Environment.DIRECTORY_PICTURES);
            }
于 2016-11-16T06:12:09.147 に答える