从相册中读取照片并显示

一、工作流程

在主界面点击按钮,从相册中选择照片,在主界面中显示图片,如图:


最终样式

二、编程思路

  1. 点击时,首先获取“sdcard”的读写权限
  2. 权限通过时,打开《相册》进行选择(系统会将选择到的图片以Uri封装,存入到intent对象中)
  3. 选择结束时,从intent中获取uri(intent.getData()), 再利用ContentResolver从uri中获取文件的绝对路径,最终显示到ImageView中。

三、目前的不足

  1. 没有做Android 4.4(API 18)以下的适配
  2. 没有考虑到用户从“相册”以外的选择文件的情况。

四、具体实现过程:

  1. 权限申请
    AndroidManifest.xml

  1. 动态权限申请
    //按钮点击事件
    public void select(View view) {
        String[] permissions=new String[]{
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
        //进行sdcard的读写请求
        if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,permissions,1);
        }
        else{
            openGallery(); //打开相册,进行选择
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode){
            case 1:
                if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    openGallery();
                }
                else{
                    Toast.makeText(this,"读相册的操作被拒绝",Toast.LENGTH_LONG).show();
                }
        }
    }
  1. 打开相册的处理
    //打开相册,进行照片的选择
    private void openGallery(){
        Intent intent=new Intent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");
        startActivityForResult(intent,1);
    }
  1. 相册选择完毕的处理
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case 1:
                handleSelect(data);
        }
    }
    //选择后照片的读取工作
    private void handleSelect(Intent intent){
        Cursor cursor=null;
        Uri uri=intent.getData();
        //如果直接是从"相册"中选择,则Uri的形式是"content://xxxx"的形式
        if("content".equalsIgnoreCase(uri.getScheme())){
          cursor= getContentResolver().query(uri,null,null,null,null);
          if(cursor.moveToFirst()){
              int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
              String path=cursor.getString(columnIndex);
              Bitmap bitmap= BitmapFactory.decodeFile(path);
              photo.setImageBitmap(bitmap);
          }
        }
        else{
            Log.i("other","其它数据类型.....");
        }
        cursor.close();
    }

你可能感兴趣的:(从相册中读取照片并显示)