拍照和从图库选择图片(转自 第二行代码)

拍照

private Uri imgUri;
private static final int TAKE_PHOTO=1;

//创建file对象,用于存储拍照后的照片
//getExternalCacheDir()应用关联缓存目录,指SD卡中专门用于存放当前应用缓存数据的位置
//具体的路径是/sdcard/Android/data/<package name>/cache
File outputImage=new File(getExternalCacheDir(),"output_iamge.jpg");
try{
    if(outputImage.exists()){
        outputImage.delete();
    }
    outputImage.createNewFile();
}catch(IOException e){
    e.printStackTrace();
}

//读取图片
if(Build.VERSION.SDK_INT>Build.VERSION_CODES>N){
    //在Android7.0之后,直接使用本地真实路径的Uri被认为是不安全的,所以调用FileProvider的getUriForFile()方法将File转换成一个封装过的Uri对象
    imgUri=FileProvider.getUriForFile(this,"packagename.fileprovider",outputImage)
}else{
    //将File对象转换成Uri对象
    imgUri=Uri.fromUri(outputImage);
}

//启动相机程序
Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,imgUri);
startActivityForResult(intent,TAKE_PHOTO);

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch(requestCode){
        case:TAKE_PHOTO:{
            if(resultCode==RESULT_OK){
                try{
                    Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(imgUri));
                    //对图片进行处理
                }
            }
        }break;
        default:break;
    }
}

从图库读取图片

public static final int CHOOSE_PHOTO=2;

//
if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
    ActivityCompat.requestPermission(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else{
    openAlbum();
}

@Override
public void onRequestPermissionResult(int requestCode,@NonNull String[] permissions,@NonNull int grantResults ){
    switch(requestCode){
        case 1:{
            if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
                openAlbum();
            }else{
                Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();
            }
        }break;
    }
}

/**
*启动打开图库
*/
public void openAlbum(){
    Intent intent=new Intent("android.intent.action.GET_CONTENT");
    intent.setType("image/*");
    startActivityForResult(intent,CHOOSE_PHOTO);
}

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch(requestCode){
            if(resultCode=RESULT_OK){
                if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT){
                    //Android4.4开始,选取相册中的图片不再返回真实的Uri,是一个封装的Uri,所以需要对Uri尽享解析
                    handleImageOnKitKat(data);
                }else{
                    handleImageBeforeKitkat(data);
                }
            }
    }
}


@TargetApi(19)
private void handleImageOnKitkat(Intent data){
    String imgPath=null;
    Uri uri=data.getData();
    if(DocumentContract.isDocumentUri(this,uri)){
        //如果返回的Uri是document类型的话,那就取出document id进行处理
        String documentId=DocumentContract.getDocumentId(uri);
        if("com.android.providers.media.documents".equals(uri.getAuthority())){
            //如果Uri的authority是media格式的话,document id还需要再进行一次解析,要通过字符串分割的方式取出后半部分才能得到真正的数字id
            String id=documentId.split(":")[1];
            String selection=MediaStore.Images.Media._ID+"="+id;
            //取出的id用于构建新的Uri和条件语句
            imagePath=getImagePath(MeidaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
        }else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){
            Uri contentUri=ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(documentId));
            imagePath=getImagePath(contentUri,null);
        }
    }else if("content".equalsIgnoreCase(uri.getScheme())){
        imagePath=getImagePath(contentUri,null);
    }else if("file".equalsIgnoreCase(uri.getScheme())){
        imagePath=uri.getPath();
    }
    displayImage(imagePath);
}

private void handleImageBeforeKitkat(Intent data){
    Uri uri=data.getData();
    String imagePath=getImagePath(uri,null);
    displayImage(imagePath);
}

private void getImagePath(Uri uri,String selection){
    String path=null;
    //通过Uri和selection获取真实的图片路径
    Cursor cursor=getContentResolver().query(uri,null,selection,null,null);
    if(cursor!=null){
        if(cursor.moveToFirst()){
            path=cursor.getString(cursor.getColumnIndex(MediaStore.Iamges.Media.DATA));
        }
        cursor.close();
    }
    return path;
}

private void displayImage(String imagePath){
    if(imagePath!=null){
        Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
        //do something
    }else{
        Toast.makeText(this,"failed to get image",Toast.LENGTH_SHORT).show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值