我需要将文件从资产复制到外部存储.这是我的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我还在表格中加入了许可
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
执行时发生异常f.createNewFile(),说"权限被拒绝".
我该怎么办呢?
M. *_*han 32
在我的情况下,这是由于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
);
}
}
Run Code Online (Sandbox Code Playgroud)
在应用程序启动或您需要权限时调用此函数.
AndroidManifest.xml中
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
可以在此处找到权限的详细示例代码.
Ish*_*aan 25
最近在 API 级别 29 中,他们更改了访问外部存储的方式。如果您尝试访问公共文件夹(即下载),它将抛出权限被拒绝错误。
您需要在清单文件中的应用程序标签中指定以下代码。
android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)
或者您可以将文件保存在根目录中以避免此错误。
做f.mkdirs()之前f.createNewFile().您可能正在尝试在不存在的目录中创建新文件