关于:ImageView加载图片 路径没问题,图片不显示

博客介绍了Android中ImageView加载本地图片的相关问题。指出加载时需在AndroidManifest.xml文件中加权限,但即便如此仍可能无法显示图片。经调查发现,Android 6.0之后还需添加运行时权限,给出了相应代码,还提及imageView.setImageURI(uri)方法同样有效。

来源:https://blog.youkuaiyun.com/crescent__moon/article/details/78758605

先说一下如何获得本地图片的路径。

//点击图片事件

ib.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View view){

        getImageFromAlbum();

        }

        });


//调用本地图片库

protected void getImageFromAlbum(){

        Intent i=new Intent(

        Intent.ACTION_PICK,

        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        startActivityForResult(i,2);

        }


//获取本地图片路径并加载图片

@Override

protected void onActivityResult(int requestCode,int resultCode,Intent data){


        if(requestCode==2&&resultCode==RESULT_OK){

        Uri u=data.getData();

        ContentResolver cr=AddActivity.this.getContentResolver();

        try{

        Bitmap bmp=BitmapFactory.decodeStream(cr.openInputStream(u));

        ib.setImageBitmap(bmp);

        String[]filePathColumn={MediaStore.Images.Media.DATA};

        Cursor cursor=context.getContentResolver().query(u,

        filePathColumn,null,null,null);

        cursor.moveToFirst();

        int columnIndex=cursor.getColumnIndex(filePathColumn[0]);

        //Path就是图片在储存卡所在的位置

        path=cursor.getString(columnIndex);


        }catch(Exception e){

        e.printStackTrace();

        }

        }

        super.onActivityResult(requestCode,resultCode,data);

        }

ImageView通过加载路径显示图片。

Bitmap bmp = BitmapFactory.decodeFile(path);
    ib.setImageBitmap(bmp);

当然还要在AndroidManifest.xml文件中加入权限。

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

但是即使是这样,ImageView仍然无法显示图片,可是路径是对的啊,权限也已经加上了啊。

AS会显示这个错误:

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Download/timg (2).jpg (Permission denied)

提示的错误就是没有加载这个图片的权限。

可是刚刚不是已经在AndroidManifest.xml这个文件中加入了吗?

通过一番调查发现,原来android6.0之后不仅需要在Mainfest里面添加权限,还需要添加运行时权限。

这样的话就得在程序中加入如下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add);
    //允许开启访问本地文件权限
    requestWritePermission();
    init();
    OnClick();
}
private void requestWritePermission(){
    if (ActivityCompat.checkSelfPermission(AddActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(AddActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
    }
}

这样的话在运行程序时,如果加载图片,它会有如下提示:

就是问你这个程序能否访问你的设备,此时点击ALLOW,就会显示图片了。

------------------------------------以上是转载内容-------------------------------------

对于imageView.setImageURI(uri);此方法同样有效,亲测可用!

只需:

private void requestWritePermission() {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }
}

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

就可以搞定啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值