图片一直无法显示
报错信息:Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/cutcamera.jpg: open failed: EACCES (Permission denied)
问题排查过程如下:
初步尝试添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
结果失败;
第二次尝试: AndroidManifest.xml 中加入 android:requestLegacyExternalStorage=“true”
结果失败;
第三次尝试:动态申请权限
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); askPermissions(); ImageView imageView = (ImageView) findViewById(R.id.picture_show); Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "cutcamera.jpg"); imageView.setImageBitmap(bitmap); } private void askPermissions() {//动态申请权限! if (Build.VERSION.SDK_INT >= 23) { int REQUEST_CODE_CONTACT = 101; String[] permissions = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS,//联系人的权限 Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};//读写SD卡权限 //验证是否许可权限 for (String str : permissions) { if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) { //申请权限 this.requestPermissions(permissions, REQUEST_CODE_CONTACT); } } } }
结果:第一次运行,允许权限后内存图片依然无法显示,但是再次启动程序居然可以显示图片了。看来是需要动态申请权限的。
第四次尝试:将图片访问加入onStart()或onResume()中。
@Override protected void onStart() { super.onStart(); ImageView imageView = (ImageView) findViewById(R.id.picture_show); Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "cutcamera.jpg"); imageView.setImageBitmap(bitmap); } @Override protected void onResume() { super.onResume(); ImageView imageView = (ImageView) findViewById(R.id.picture_show); Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "cutcamera.jpg"); imageView.setImageBitmap(bitmap); }
结果无效