读取本地相册 兼容了小米

本文介绍了在Android中如何调用相册选取图片,并通过Intent进行图片剪切的方法。特别针对小米手机做了兼容处理,同时提供了获取图片路径、图片压缩等实用工具类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

权当记录了;
首先想要调用相册需要执行Intent过去;

 private void intentimage() {
                Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
                getAlbum.setType(IMAGE_TYPE);
                startActivityForResult(getAlbum, IMAGE_CODE);
            }
private final String IMAGE_TYPE = "image/*";
    private final int IMAGE_CODE = 1;
    private final int TAKE_PHOTO = 0;
    private final int PHOTO_REQUEST_CUT=2;

需要的一些变量;
然后就是在activity的onActivityResult的方法里面得到图片的Url,这里面有个坑,就是小米的手机的不支持这么拿,会报空指针;

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
        ContentResolver resolver = this.getContentResolver();
        if (data != null) {
            switch (requestCode) {
                case TAKE_PHOTO: //拍摄图片并选择
                    // 两种方式 获取拍好的图片
                    Toast.makeText(this, "拍照的", Toast.LENGTH_SHORT).show();
                    if (data.getData() != null || data.getExtras() != null) {
                        //防止没有返回结果
                        Uri uri = data.getData();
                        if (uri == null) {
                            Toast.makeText(this, "找不到图片", Toast.LENGTH_SHORT).show();
                        }
                    }
                    break;
                case IMAGE_CODE:
                    Uri originalUri = data.getData();
                    crop(originalUri);
                   /* Toast.makeText(this, originalUri.getPath(), Toast.LENGTH_SHORT).show();
                    String path1 = MiPictureHelper.getPath(this, originalUri);
                    Bitmap bitmap = PictureUtils.getSmallBitmap(path1, 60, 60);
                    activityCompleteuserPortrait.setImageBitmap(bitmap);
                    saveBitmap(bitmap);*/
                    break;
                case PHOTO_REQUEST_CUT:
                    // 从剪切图片返回的数据
                    if (data != null) {
                        Bitmap bitmap = data.getParcelableExtra("data");
                        saveBitmap(bitmap);
                        activityCompleteuserPortrait.setImageBitmap(bitmap);
                                  }
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

上面加入了 剪切圆形图片,不需要的可以直接去掉,圆形图片的方法;

  /*      * 剪切图片      */
    private void crop(Uri uri) {
        // 裁剪图片意图
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        // 裁剪框的比例,1:1
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // 裁剪后输出图片的尺寸大小
        intent.putExtra("outputX", 250);
        intent.putExtra("outputY", 250);
        intent.putExtra("outputFormat", "JPEG");// 图片格式
        intent.putExtra("noFaceDetection", true);// 取消人脸识别
        intent.putExtra("return-data", true);
        // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
        startActivityForResult(intent, PHOTO_REQUEST_CUT);
    }

关键的一个工具类;兼容了小米的地方;

public class MiPictureHelper {
    @SuppressLint("NewApi")
    public static String getPath(final Context context, final Uri uri) {
        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = "_id=?";
                final String[] selectionArgs = new String[] { split[1] };
                return getDataColumn(context, contentUri, selection,
                        selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return null;
    }
    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = { column };
        try {
            cursor = context.getContentResolver().query(uri, projection,
                    selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }
    private static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }
}

一个图片压缩的工具类;

public class PictureUtils {
    /**
     * 计算图片的缩放值
     *
     * @param options
     * @param reqWidth
     * @param reqHeight
     * @return
     */
    public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;

        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            // Calculate ratios of height and width to requested height and
            // width
            final int heightRatio = Math.round((float) height
                    / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
            // Choose the smallest ratio as inSampleSize value, this will
            // guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        return inSampleSize;
    }
    /**
     * 根据路径获得突破并压缩返回bitmap用于显示
     *
     * @param filePath
     * @return
     */
    public static Bitmap getSmallBitmap(String filePath, int reqWidth, int reqHeight) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;  //只返回图片的大小信息
        BitmapFactory.decodeFile(filePath, options);
        // Calculate inSampleSize
        //options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        options.inSampleSize = 5;
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(filePath, options);
    }
}

附上一个读取本地图片并且保存到指定的文件夹的的;

private String portrait;
 public void saveBitmap(Bitmap bm) {
        portrait = Environment.getExternalStorageDirectory().getPath() + "/taose/" + System.currentTimeMillis() + ".jpg";
        File file=new File(Environment.getExternalStorageDirectory().getPath() + "/taose/");
        file.mkdirs();
        File f = new File(portrait);
        Log.i("创建成功了么","chenggl");
      /*  if (f.exists()) {
            f.delete();
        }*/
        try {
            FileOutputStream out = new FileOutputStream(f);
            bm.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            Log.i("创建成功了么","chenggl12321");
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Log.i("创建成功了么","chenggl6666666666");
            e.printStackTrace();
        }

    }

好了 图片这块就到这了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值