19

アセットから外部ストレージにファイルをコピーする必要があります。これが私のコードです:

    File f = new File(Environment.getExternalStorageDirectory() + File.separator
            + "MyApp" + File.separator + "tessdata" + File.separator + "eng.traineddata");
    if (!f.exists()) {
    AssetManager assetManager = getAssets();
    try {
        f.createNewFile();
        InputStream in = assetManager.open("eng.traineddata");
        OutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory() + File.separator
            + "MyApp" + File.separator  + "tessdata" + File.separator + "eng.traineddata");
        byte[] buffer = new byte[1024];
        int read;
            while ((read = in.read(buffer)) != -1)
                    out.write(buffer, 0, read);
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        } catch (IOException e) {
            Log.e("tag", "Failed to copy asset file: ", e);
        }
    }

マニフェストに許可も追加しました

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

f.createNewFile()を実行すると、「許可が拒否されました」という例外が発生しました。

どうすれば修正できますか?

4

6 に答える 6

39

私の場合、マニフェストにアクセス許可を追加したとしても、API 23+ に必要なアクセス許可ポップアップが原因でした。

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

アプリの起動時または権限が必要なときに、この関数を呼び出します。

AndroidManifest.xml

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

アクセス許可の詳細なサンプル コードは、ここにあります。

于 2016-12-19T10:41:15.670 に答える
2

これを試して:

private void copy() {

File dirOri = new File(Environment.getExternalStorageDirectory() +"/somefolder/somefile");
File dirDest = new File(Environment.getExternalStorageDirectory() + "/yourfolder");

FileChannel src = null;
FileChannel dst = null;

try {
    src = new FileInputStream(dirOri).getChannel();
    dst = new FileOutputStream(dirDest).getChannel();
    dst.transferFrom(src, 0, src.size());               
    src.close();
    dst.close();
} catch (Exception e) {}
}

- 編集 -

マニフェストに追加:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  
于 2013-05-03T14:44:13.203 に答える