前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 调用系统相机 返回图片模糊的解决办法

Android 调用系统相机 返回图片模糊的解决办法

作者头像
码客说
发布2019-10-22 14:33:20
1.9K0
发布2019-10-22 14:33:20
举报
文章被收录于专栏:码客码客

所需权限

代码语言:javascript
复制
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA" />

默认方式(缩略图 图片模糊)

定义全局变量

代码语言:javascript
复制
private static final int CAMERA = 0;

调用

代码语言:javascript
复制
//调用相机
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(camera, CAMERA);

回调

代码语言:javascript
复制
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA && resultCode == Activity.RESULT_OK && data != null) {
        String sdState = Environment.getExternalStorageState();
        if (!sdState.equals(Environment.MEDIA_MOUNTED)) {
            return;
        }
        String name = DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg";
        Bundle bundle = data.getExtras();
        //获取相机返回的数据,并转换为图片格式
        Bitmap bitmap = (Bitmap) bundle.get("data");
        FileOutputStream fout = null;
        String file_path = ApiModel.ZJ_FILE_BASE_PATH + name;
        File file = new File(file_path);
        file.getParentFile().mkdirs();

        try {
            fout = new FileOutputStream(file_path);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                fout.flush();
                fout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Kotlin

代码语言:javascript
复制
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == CAMERA && resultCode == Activity.RESULT_OK && data != null) {
        doAsync {
            val name = DateFormat.format(
                "yyyyMMdd_hhmmss",
                Calendar.getInstance(Locale.CHINA)
            ).toString() + ".jpg"

            val bundle = data.extras
            //获取相机返回的数据,并转换为图片格式
            val bitmap = bundle.get("data") as Bitmap
            var fout: FileOutputStream? = null
            val file_path = ZJBitmapUtil.getSavePath(mContext) + name
            val file = File(file_path)
            file.getParentFile().mkdirs()

            try {
                fout = FileOutputStream(file_path)
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout)
            } catch (e: FileNotFoundException) {
                e.printStackTrace()
            } finally {
                try {
                    fout!!.flush()
                    fout!!.close()
                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
            uiThread {
                head_imageview.setImageBitmap(ZJBitmapUtil.getLoacalBitmap(file_path))
            }
        }
    }
}

返回原图(解决图片模糊)

定义全局变量

代码语言:javascript
复制
private static final int CAMERA = 0;
String tempImagePath="";

调用

代码语言:javascript
复制
//原图
Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
tempImagePath = ApiModel.ZJ_FILE_BASE_PATH + "tempImage.jpg"; //拍照文件保存路径
intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(tempImagePath)));
startActivityForResult(intent2, CAMERA);

回调

代码语言:javascript
复制
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA && resultCode == Activity.RESULT_OK) {
    String sdState = Environment.getExternalStorageState();
    if (!sdState.equals(Environment.MEDIA_MOUNTED)) {
        return;
    }
    
    //下面是用的Rx在io线程中压缩图片
    Observable
            .create(new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {
                    try {
                        String outImagePath = ApiModel.ZJ_FILE_BASE_PATH + "outImage.jpg";
                        ImageUtils.compressAndGenImage(tempImagePath, outImagePath, 100, true);
                        subscriber.onNext(outImagePath);
                        subscriber.onCompleted();
                    } catch (IOException e) {

                    }

                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<String>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                    Log.w(TAG, "onError: " + e.getLocalizedMessage());
                }

                @Override
                public void onNext(String imagePath) {
                    didSendImage(imagePath);

                }
            });
    }

}

相册中选取图片

Kotlin

代码语言:javascript
复制
var PHOTO = 10000;

val photo = Intent(
    Intent.ACTION_PICK,
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
)
startActivityForResult(photo, PHOTO)

回调

代码语言:javascript
复制
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == PHOTO && resultCode == Activity.RESULT_OK && data != null) {
        try {
            doAsync {
                var path = ""
                val selectedImage = data.data //获取系统返回的照片的Uri
                val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
                val cursor = contentResolver.query(
                    selectedImage,
                    filePathColumn,
                    null,
                    null,
                    null
                )
                //从系统表中查询指定Uri对应的照片
                cursor!!.moveToFirst()
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                path = cursor.getString(columnIndex)  //获取照片路径
                cursor.close()
                val bitmap = BitmapFactory.decodeFile(path)
                uiThread {
                    head_imageview.setImageBitmap(bitmap)
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 所需权限
  • 默认方式(缩略图 图片模糊)
  • 返回原图(解决图片模糊)
  • 相册中选取图片
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档