Can';即使有用户权限,也不能将文件保存在外部存储器上[Android]
我正在Android上开发一个用于图像处理的应用程序,但我一直在编写图像保存代码 以下是我使用的方法:Can';即使有用户权限,也不能将文件保存在外部存储器上[Android],android,android-intent,android-bitmap,Android,Android Intent,Android Bitmap,我正在Android上开发一个用于图像处理的应用程序,但我一直在编写图像保存代码 以下是我使用的方法: private void saveImageToExternalStorage(Bitmap finalBitmap) { String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); File myDir = new File(ro
private void saveImageToExternalStorage(Bitmap finalBitmap) {
String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File myDir = new File(root + "/saved_images");
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String fname = "Image-" + n + ".jpg";
File file = new File(myDir, fname);
if (file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
}
catch (Exception e) {
e.printStackTrace();
}
// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this, new String[]{file.toString()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
每次执行此操作时,FileOutputStream都会给出一个FileNotFoundException
我的舱单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gabrielerestuccia.testimmagini">
<application
...
</application>
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
我在安卓6上也有同样的问题。这是因为新的权限模型
您可以使用以下代码动态检查您是否具有权限:
private static boolean canWriteToExternalStorage(Context context) {
return ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
public void onCreate(Bundle savedInstanceState) {
...
checkWritingPermission();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE_PERMISSION) {
if (grantResults.length >= 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
} else {
// permission wasn't granted
}
}
}
private void checkWritingPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// permission wasn't granted
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION);
}
}
}
您还可以通过转到设置->应用->应用->应用->应用权限并打开存储项目来启用应用的写入权限
为了向用户请求此权限,您应该在活动中添加以下代码:
private static boolean canWriteToExternalStorage(Context context) {
return ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
public void onCreate(Bundle savedInstanceState) {
...
checkWritingPermission();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE_PERMISSION) {
if (grantResults.length >= 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
} else {
// permission wasn't granted
}
}
}
private void checkWritingPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// permission wasn't granted
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION);
}
}
}
每次执行此操作时,FileOutputStream都会给出一个FileNotFoundException
。但您仍在呼叫媒体扫描程序。更好:在catch语句中返回。myDir.mkdirs()代码>。您应该检查返回值,如果为false,则不要继续。如果目录已经存在,不要调用mkdirs。“/saved_images”
。您检查过该目录现在是否存在吗?f.createNewFile()代码>。您可以删除该语句,因为新文件输出流将创建该文件。谢谢!我忘了棉花糖的新许可模式。