Android利用手机拍照和从相册读取照片的方法

private void initView() {

    //拍照按钮
    photo = (ImageView) findViewById(R.id.photo);
    Button take_photo = (Button) findViewById(R.id.take_phone);

    take_photo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //新建一个缓存图片文件
            File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
            if (outputImage.exists()) {//如果文件存在,则先删除
                outputImage.delete();
            }
            try {
                outputImage.createNewFile();//创建文件
            } catch (IOException e) {
                e.printStackTrace();
            }

            //如果系统是Android7.0及以上,系统认为直接使用真实路径的uri是不安全的,
            //会抛出FileUriExposedException。FileProvider是一种特殊的内容提供器,
            //它可以选择性的将封装后的uri共享给外部,从而提高了安全性。
            //不过它还需要在manifest文件中声明:
            /*
            * <provider
                android:authorities="com.example.cameraalbumtest.fileprovider"(这里需要与getUriForFile方法中的第二个参数完全一致)
                android:name="android.support.v4.content.FileProvider"
                android:exported="false"
                android:grantUriPermissions="true">

            <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>

            </provider>
            * */
            //file_path.xml这个资源是用来指定共享uri的,name名字随便,path是具体共享路径,如果为空则将整个sdk共享
            /*
            * <?xml version="1.0" encoding="utf-8"?>
                <paths xmlns:android="http://schemas.android.com/apk/res/android">
                 <external-path name="my_images" path=""/>
                </paths>
             */
            if (Build.VERSION.SDK_INT >= 24) {
                imageUri = FileProvider.getUriForFile(getApplicationContext(),
                        "com.example.cameraalbumtest.fileprovider", outputImage);
            } else {
                imageUri = Uri.fromFile(outputImage);
            }

            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            startActivityForResult(intent, 1);
        }
    });

    //从相册选择图片按钮
    Button pick = (Button) findViewById(R.id.pick_photo);
    pick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //判断是否拥有写啥sd卡的权限,有则打开相册,否则申请权限
            if (ContextCompat.checkSelfPermission(getApplicationContext(),
                    Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                openAlbum();
            } else {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
            }
        }
    });
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case 100:
            if (grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED) {
                openAlbum();
            } else {
                Toast.makeText(this, "没有授权,洗洗睡吧", Toast.LENGTH_SHORT).show();
            }
            break;
    }
}

/**打开相册*/
private void openAlbum() {
    Intent intent = new Intent("android.intent.action.GET_CONTENT");
    intent.setType("image/*");
    startActivityForResult(intent, 2);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case 1:
                try {
                    //将拍照的相片路径转换成图片,展示出来
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                    photo.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                break;

            case 2:
                //如果系统API大于19即Android4.4以上的系统,选择照片后不是返回的真实的图片的uri需要进一步的解析
                if (Build.VERSION.SDK_INT >= 19) {
                    handleImageOnKitKat(data);
                } else {
                    handleImageBeforeOnKitKat(data);
                }
                break;
        }
    }
}

//API大于等于19时解析返回的uri获取真实的图片路径并把图片显示在imageview上的方法
private void handleImageOnKitKat(Intent data) {
    String imagePath = null;
    Uri uri = data.getData();
    Log.i("zhangdi",uri.toString());
    //如果uri是document类型则取出uri的documentID,如果不是则普通方法处理,如果uri的Authority
    //是media类型,则需要拆分id取出真正的id值,重构uri
    if (DocumentsContract.isDocumentUri(this, uri)) {

        String docId = DocumentsContract.getDocumentId(uri);
        Log.i("zhangdi",docId);
        if ("com.android.providers.media.documents".equals(uri.getAuthority())) {

            String id = docId.split(":")[1];
            String selection = MediaStore.Images.Media._ID+"="+id;
            imagePath = getImagePath(MediaStore.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(docId));
            imagePath = getImagePath(contentUri, null);
        }
    } else if ("content".equals(uri.getScheme())) {
        imagePath = getImagePath(uri, null);
    } else if ("file".equals(uri.getScheme())) {
        imagePath = uri.getPath();
    }

    displayImage(imagePath);
}

private void displayImage(String imagePath) {
    if(!TextUtils.isEmpty(imagePath)) {
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
        photo.setImageBitmap(bitmap);
    } else {
        Toast.makeText(this, "找不到图片路径", Toast.LENGTH_SHORT).show();
    }
}

/**根据uri和查询条件在provider中查询出图片的真实路径*/
private String getImagePath(Uri uri, String selection) {
    String path = null;
    Cursor cursor = getContentResolver().query(uri, null,selection, null, null);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        }
        cursor.close();
    }

    return path;
}

//API小于19时获取图片路径并显示的方法
private void handleImageBeforeOnKitKat(Intent data) {
    Uri uri = data.getData();
    String imagePath = getImagePath(uri, null);
    displayImage(imagePath);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值