Andorid学习--8.0读取系统图库中的图片以及动态文件访问权限设置

在课程学习过程中,遇到了如下需求:

     运行“新建联系人”程序,点击新建联系人按钮,打开输入信息界面并输入姓名、公司、电话号码、电子邮件并点击头像进入系统图库选择一张图片。

    自己用的是API8.0的模拟器。

首先如何实现点击进入系统图库选择照片:

为按钮添加点击事件:

        //点击修改头像
        Button btn1=(Button) findViewById(R.id.button_changeHead);
        assert btn1 != null;
        btn1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent i=new Intent(
                        Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
                );
                startActivityForResult(i, RESULT_LOAD_IMAGE);
            }
        });

由上述代码可以看出,使用了Activity数据回传的方式,startActivityForResult()。所以在该Activity中,重载函数

onActivityResult(int requestCode, int resultCode, Intent data)如下:
private static int RESULT_LOAD_IMAGE = 1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            Log.i("pathdir", picturePath);
            File file=new File(picturePath);
            if(file.exists()){
                Bitmap bm= BitmapFactory.decodeFile(picturePath);
                imageView = (ImageView) findViewById(R.id.imageView_head);
                imageView.setImageBitmap(bm);
            }
        }

    }

上述代码已经能点击按钮,从系统图库中选择图片,但是选择图片后,imageView中显示的是空白,所以没有读出图片,但是通过Log.i(picpath)已经获取了图片的路径。

问题解决方法:

实验课询问了老师这个问题,老师告诉我是读取权限的问题,于是自己查找资料,找到了如下的解决方法:

第一步:在AndroidManifest.xml添加外部设备读取权限设置:

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

网上查找资料说,设置了本权限后,应该就可以读取了,但是好像在4.0还是6.0以后强制取得动态权限才可以,于是在该Activity中编写权限动态获取的方法:

private  static final int REQUEST_EXTERNAL_STORAGE=1;
private static String[] PERMISSIONS_STORAGE = {
            "android.permission.READ_EXTERNAL_STORAGE",
            "android.permission.WRITE_EXTERNAL_STORAGE" };
public static void checkStoragePermissions(Activity activity){
        try{
            //监测是否有写的权限
            int permission= ActivityCompat.checkSelfPermission(activity,
                    "android.permission.WRITE_EXTERNAL_STORAGE");
            int permission1= ActivityCompat.checkSelfPermission(activity,
                    "android.permission.READ_EXTERNAL_STORAGE");
            if(permission != PackageManager.PERMISSION_GRANTED){
                //没有写的权限,去申请写的权限,或弹出对话框
                ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
            }
            if(permission1 != PackageManager.PERMISSION_GRANTED){
                //没有写的权限,去申请写的权限,或弹出对话框
                ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }

并在OnCreat()方法中调用checkStoragePermission方法:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ctivity_addnewpeo);
        checkStoragePermissions(this);
        ......
}

再次运行程序即可.效果如下:

猜你喜欢

转载自blog.csdn.net/qq_36959251/article/details/89359522