Android调用系统相册和相机选择图片显示在界面

Android 调用系统相册(未进行权限判断)

Intent  intent = new Intent(Intent.ACTION_PICK);

 intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
 // intent.setType( "image/*");(此种方式也可)

 startActivityForResult(intent,ALBUM); //ALBUM 表示声明的requestCode

一个根据uri获取图片的地址

 private String getPathByUri(Context context,Uri uri){
        String path =null;

        String scheme = uri.getScheme();

        if(scheme==null){

            path = uri.getPath();

        }else  if(ContentResolver.SCHEME_FILE.equals(scheme) ){

            path = uri.getPath();

        }else if(ContentResolver.SCHEME_CONTENT.equals(scheme)){

           Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA},null,null,null);

            if(null!= cursor){

                if(cursor.moveToFirst()){

                    int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);

                    if(index > -1){
                        path = cursor.getString(index);
                    }
                }

            }
            cursor.close();


        }


         return  path;

    }

在onActivityResult 中获取返回的结果

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    if(data!=null){
         if(RESULT_OK == resultCode &&resultCode== ALBUM ){
           Uri uri = data.getData();
            if(uri!=null){
               setImg(uri);
            }
         }

    }

   }    

将图片显示在一个imagevie上

private void setImg(Uri uri){
   String imgPath=  getPathByUri(PhotoActivity.this,uri);
   Bitmap bitmap = BitmapFactory.decodeFile(imgPath);
   mImageView.setImageBitmap(bitmap);
 }

接下来是获取系统相机,一种是只获取拍照后的缩略图一种是直接返回拍照后的图片地址

1.获取缩略图的方式:

   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

   startActivityForResult(intent,TAKE_PICTURE_THUMB);//TAKE_PICTURE_THUMB requestCode

在onActivityResult中的主要代码

 if(data.hasExtra("data")){
    Bitmap thumbnail = data.getParcelableExtra("data");

    mImageView.setImageBitmap(thumbnail);

  }

2.获取图片的路径,在Android7.0中以往的获取方式会出现异常,需要使用FileProvider来实现兼容的拍照

官网问题说明
FileProvider用法

具体实现:
<1> 在manifest添加一个provider

 <!-- com.vc.xxx表示应用的包名 -->
 <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.vc.xxx.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_path" />
        </provider>

<2>在res的目录添加一个file_path.xml 如下

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path name="root" path="" />  <!-- new File("/");-->

    <files-path name="files" path="" /> <!--context.getFilesDir()-->

    <cache-path name="cache" path="" /><!--context.getCacheDir()-->

    <external-path name="external" path="vcvc" />  <!-- Environment.getExternalStorageDirectory()  这里表示声明在vcvc的目录底下 -->

    <external-files-path name="name" path="path" />  <!-- context.getExternalFilesDirs()-->

    <external-cache-path name="name" path="path" />  <!--  getExternalCacheDirs()-->

</paths>

以上完成后接下来看调用的具体方法执行之前需要判断
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) )后在执行拍照

// mImgPath图片地址的变量 
     private void takePhotos(){
        Uri  mUri =null;


        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);



        File file = new File(Environment.getExternalStorageDirectory().getPath()+"/vcvc/");
        if(!file.exists()){
            file.mkdirs();
        }

        mImgPath = Environment.getExternalStorageDirectory().getPath()+"/vcvc/" +System.currentTimeMillis() +".png";


        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
             mUri = FileProvider.getUriForFile(PhotoActivity.this,"com.vc.xxx.fileprovider",new File(mImgPath)); //7.0需要兼容方式
        }else {
             mUri = Uri.fromFile(new File(mImgPath));
        }



        intent.putExtra(MediaStore.EXTRA_OUTPUT,mUri);

        startActivityForResult(intent,TAKE_PICTURE);


    }

至此可以在onActivityResult 获取返回的结果集,当然对于一些手机拍照比较大的还是最好对图片进行一个压缩

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
       Bitmap bitmap = BitmapFactory.decodeFile(mImgPath);

        mImageView.setImageBitmap(bitmap);
    }

在其他机型还有问题的话欢迎拍砖
参考

鸿神的这篇
还有吴小龙童鞋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值