Android 9. + API 29:/storage/emulated/0/Pictures/myPic.png打开失败:EACCES(权限被拒绝) [英] Android 9.+ API 29: /storage/emulated/0/Pictures/myPic.png open failed: EACCES (Permission Denied)
问题描述
我正在尝试使用Android虚拟设备(AVD)Nexus 7(2012)API 29在Android Studio 3.4.1上使用非常基本的相机应用程序的源代码.我在模拟器中使用相机拍摄了图片并尝试保存它作为/storage/emulated/0/Pictures/myPic.png,但/storage/emulated/0/Pictures/myPic.png打开例外:EACCES(权限被拒绝).我尝试了所有在线可用的建议,例如:
I am trying the source code of a very basic camera app on Android Studio 3.4.1 with Android Virtual Device (AVD) Nexus 7 (2012) API 29. I took a picture with the camera in the emulator and tried to save it as /storage/emulated/0/Pictures/myPic.png, but got an exception of /storage/emulated/0/Pictures/myPic.png open failed: EACCES (Permission Denied). I have tried all advice available online, for instance:
- 在AndroidManifest.xml中,我添加了:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 在MainActivity.java中,我添加了以下运行时权限检查和请求代码:
public class MainActivity extends Activity {
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
public static void verifyStoragePermissions(Activity activity) {
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
boolean checkPermission = (permission == PackageManager.PERMISSION_GRANTED);
Toast toastPermission = Toast.makeText(activity,
"Is permission granted? " + checkPermission,
Toast.LENGTH_SHORT);
LinearLayout toastLayoutPermission = (LinearLayout) toastPermission.getView();
TextView toastTVPermission = (TextView) toastLayoutPermission.getChildAt(0);
toastTVPermission.setTextSize(30);
toastPermission.show();
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
- 然后我要在onCreate和我要保存图片之前检查并请求权限,如下所示:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
verifyStoragePermissions(this);
......
private void saveImageToFile(File file)
{
if (mCameraBitmap != null)
{
FileOutputStream outStream = null;
verifyStoragePermissions(this);
try
{
outStream = new FileOutputStream(file);
...
}
catch (Exception e)
{
Toast toastException = Toast.makeText(MainActivity.this,
"Exception: " + e.getMessage(),
Toast.LENGTH_SHORT);
LinearLayout toastLayoutException = (LinearLayout) toastException.getView();
TextView toastTVException = (TextView) toastLayoutException.getChildAt(0);
toastTVException.setTextSize(30);
toastException.show();
}
...
- 我还手动在模拟器中检查了存储许可,以确保允许访问存储.
但是,所有建议都无效!
However, NONE of the advice works!
代码抛出了一个异常
/storage/emulated/0/Pictures/myPic.png打开失败:EACCES(权限被拒绝)
/storage/emulated/0/Pictures/myPic.png open failed: EACCES (Permission Denied)
到达
outStream = new FileOutputStream(file);
有进一步解决这个问题的想法吗?非常感谢.
Any idea to further solve this? Thanks a lot.
推荐答案
在Android清单中添加 android:requestLegacyExternalStorage ="true" 对我来说适用于Android 29
Adding android:requestLegacyExternalStorage="true" to the Android Manifest worked for me with Android 29
<application
android:name=".MyApplication"
android:allowBackup="true"
android:requestLegacyExternalStorage="true" ...
这篇关于Android 9. + API 29:/storage/emulated/0/Pictures/myPic.png打开失败:EACCES(权限被拒绝)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!