• Android 调用相机、相册功能


      清单文件中增加对应权限,动态申请权限(此部分请参考Android 动态申请权限,在此不作为重点描述)


    private static final int REQUEST_CODE_ALBUM = 100;//打开相册
    private static final int REQUEST_CODE_CAMERA = 101;//打开相机

    //调用相册
    private void openAlbum(){
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    startActivityForResult(intent, REQUEST_CODE_ALBUM);
    }
    //调用相机
    private void openCamera1(){
    Intent intent;
    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, REQUEST_CODE_CAMERA);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE_ALBUM && resultCode == RESULT_OK){
    if (data != null) {
    // 照片的原始资源地址
    Uri uri = data.getData();
    String path = uri.getPath();
    ContentResolver cr = context.getContentResolver();
    try {
    Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
    /* 将Bitmap设定到ImageView */
    imageView.setImageBitmap(bitmap);
    } catch (FileNotFoundException e) {
    Log.e("Exception", e.getMessage(), e);
    }
            }
    }else if(requestCode == REQUEST_CODE_CAMERA && resultCode == RESULT_OK){
    if(data != null && data.getData() != null){
    Bundle extras = data.getExtras();
    if (extras != null) {
    Bitmap bitmap = extras.getParcelable("data");
    /* 将Bitmap设定到ImageView */
    imageView.setImageBitmap(bitmap);
              //可将图片保存下来,用于上传或其他操作(如果不需要可以省略此步)
              String path = savePicToSdcard(image,Environment.getExternalStorageDirectory().getPath(),System.currentTimeMillis() + ".jpg");
                }
    }
    }
    }

    public static String savePicToSdcard(Bitmap bitmap, String path, String fileName) {
    String filePath = "";
    if (bitmap != null) {
    filePath = path + File.separator + fileName;
    File destFile = new File(filePath);
    OutputStream os = null;
    try {
    os = new FileOutputStream(destFile);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
    os.flush();
    os.close();
    } catch (IOException e) {
    filePath = "";
    }
    }
    return filePath;
    }


    上述相机方法相片清晰度低,获取的是返回对象中的略缩图;如对照片清晰度有要求,可以在上面方法的基础上进行修改,方法如下:

    需要在清单文件中application中增加如下代码:
    <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" />
    </provider>

    创建file_paths.xml文件

    项目目录res下创建xml文件夹,xml文件夹下创建file_paths.xml文件,文件内容:
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
    <external-path
    name="external_storage_root"
    path="." />
    </paths>

    配置完成后,修改增加如下代码:
    private static final int REQUEST_RESULT_CODE = 102;//裁剪后保存
    //调用相机(指定相机拍摄照片保存地址,相片清晰度高)
    private void openCamera2(){
    String photoPath = Environment.getExternalStorageDirectory().getPath()+"/"+File.separator+"123.jpg";
    File pictureFile = new File(photoPath);
    Uri picUri;
    Intent intent;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    String packageName = context.getApplicationContext().getPackageName();
    picUri = FileProvider.getUriForFile(context, new StringBuilder(packageName).append(".fileprovider").toString(), pictureFile);
    } else {
    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    picUri = Uri.fromFile(pictureFile);
    }
    intent.putExtra(MediaStore.EXTRA_OUTPUT, picUri);
    startActivityForResult(intent, REQUEST_CODE_CAMERA);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE_ALBUM && resultCode == RESULT_OK){
    if (data != null) {
    // 照片的原始资源地址
    Uri uri = data.getData();
    String path = uri.getPath();
    ContentResolver cr = context.getContentResolver();
    try {
    Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
    /* 将Bitmap设定到ImageView */
    imageView.setImageBitmap(bitmap);
    } catch (FileNotFoundException e) {
    Log.e("Exception", e.getMessage(), e);
    }
    }
    }else if(requestCode == REQUEST_CODE_CAMERA && resultCode == RESULT_OK){
    File tempFile = new File(photoPath);
    cropImg(getImageContentUri(tempFile));//对照片进行裁剪保存
    }else if(requestCode ==REQUEST_RESULT_CODE && resultCode == RESULT_OK){
    try {
    Bitmap image = BitmapFactory.decodeStream(getContentResolver().openInputStream(mUriPath));
    /* 将Bitmap设定到ImageView */
    imageView.setImageBitmap(bitmap);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    }
    }

    public Uri getImageContentUri(File imageFile) {
        String filePath = imageFile.getAbsolutePath();
    Cursor cursor = getContentResolver().query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    new String[]{MediaStore.Images.Media._ID},
    MediaStore.Images.Media.DATA + "=? ",
    new String[]{filePath}, null);

    if (cursor != null && cursor.moveToFirst()) {
    int id = cursor.getInt(cursor
    .getColumnIndex(MediaStore.MediaColumns._ID));
    Uri baseUri = Uri.parse("content://media/external/images/media");
    return Uri.withAppendedPath(baseUri, "" + id);
    } else {
    if (imageFile.exists()) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DATA, filePath);
    return getContentResolver().insert(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    } else {
    return null;
    }
    }
    }

    public void cropImg(Uri uri){
        Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");

    //实现对图片的裁剪,必须要设置图片的属性和大小
    intent.putExtra("crop", "true"); //滑动选中图片区域
    intent.putExtra("aspectX", 1); //裁剪框比例1:1
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 700); //输出图片大小
    intent.putExtra("outputY", 700);
    intent.putExtra("return-data", true); //有返回值

    String mLinshi = System.currentTimeMillis() + ".jpg";
    photoFile = new File(Environment.getExternalStorageDirectory().getPath(), mLinshi);

    mUriPath = Uri.parse("file://" + photoFile.getAbsolutePath());
    //将裁剪好的图输出到所建文件中
    intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriPath);
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    //注意:此处应设置return-data为false,如果设置为true,是直接返回bitmap格式的数据,耗费内存。设置为false,然后,设置裁剪完之后保存的路径,即:intent.putExtra(MediaStore.EXTRA_OUTPUT, uriPath);
    intent.putExtra("return-data", false);
    startActivityForResult(intent, REQUEST_RESULT_CODE);
    }


  • 相关阅读:
    一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10(如果今天你的老板还在要求你兼容IE6~8,别犹豫,辞职吧。)
    HTML元素分类【三种类型】
    React-Native 学习笔记-Android开发平台-开发环境搭建
    常用原生JS函数和语法集合
    jQuery选择器总结
    jQuery选择器大全
    Sublime Text 3 的HTML代码格式化插件Tag
    用CSS画三角形
    纯CSS绘制三角形(各种角度)
    纯CSS写三角形-border法[晋级篇01]
  • 原文地址:https://www.cnblogs.com/LEON-D/p/11389346.html
Copyright © 2020-2023  润新知