android打开相机选图及相册选图操作

本文介绍了两种在Android应用中实现打开相机拍摄和从相册选择图片的方法。关键步骤包括权限声明、使用ContentProvider以及配置file_paths.xml文件。确保在Android 6.0及以上版本中正确设置权限和内容提供器,以避免程序无法运行的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种:从相机进行拍摄,选择照片作为头像放置imageview。
第二种:从手机相册中选择图片,进行选择照片作为头像。

public class MainActivity extends AppCompatActivity {

    @Bind(R.id.take_photo)
    Button takePhoto;
    @Bind(R.id.img_one)
    ImageView imgOne;
    @Bind(R.id.select_photo)
    Button selectPhoto;

    private Uri imageUri;
    public static final int TAKE_PHOTO = 1;
    public static final int CHOOSE_PHOTO = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (Build.VERSION.SDK_INT >= 24) {
                    imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.chenxuanhe." +
                            "cameratest", outputImage);
                } else {
                    imageUri = Uri.fromFile(outputImage);
                }
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, TAKE_PHOTO);
            }
        });

        selectPhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED) {

  ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                } else {
                    openAlbum();
                }
            }
        });
    }

    /**
     * 授权返回的结果,case 1 是申请权限的唯一请求码,结果封装在granrResult数组里面
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
        switch(requestCode){
            case 1:
                if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    openAlbum();
                }else {
                    Toast.makeText(this, "你禁止了权限无法打开相册", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
            //    break;
        }
    }

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

    /**
     * 对照相返回的结果码操作
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {//这个OK是系统返回的
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(
                                getContentResolver().openInputStream(imageUri));
                        imgOne.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            case CHOOSE_PHOTO:
                if (resultCode == RESULT_OK) {
       //android版本4.4上下有区别,4.4之后封装路径,4.4之前真实路径
                    if (Build.VERSION.SDK_INT >= 19) {
                        handleImageOnKitkat(data);
                    } else {
                        handleImageBeforeKitKat(data);
                    }
                }
                break;
            default:
                break;
        }
    }


    /**
     * 从相册选择照片作为展示图片
     * @param imagePath
     */
    private void displayImage(String imagePath) {
        if (imagePath != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
       imgOne.setImageBitmap(bitmap);//将bitmap设置imageview图片
        } else {
            Toast.makeText(this, "图片设置失败,请重新选择图片~", Toast.LENGTH_SHORT).show();
        }

    }

    /**
     * 获得SD卡照片的路径
     * @param uri
     * @param selection
     * @return
     */
    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;
    }


    /**
     * 安卓4.4之前的版本获取路径,为真实路径,不需解析直接用
     * @param data
     */
    private void handleImageBeforeKitKat(Intent data) {
        Uri uri = data.getData();
        String imagePath = getImagePath(uri, null);
        displayImage(imagePath);
    }

    /**
     * 安卓4.4之后的版本获取路劲,要对路径解析
     * @param data
     */
    @TargetApi(19)
    private void handleImageOnKitkat(Intent data) {
        Uri uri = data.getData();
        String imagePath = null;
        if(DocumentsContract.isDocumentUri(this,uri)){
            //如果是Document类型的uri,则通过Document类型的id处理
            String docId = DocumentsContract.getDocumentId(uri);
            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.111.documents".equals(uri.getAuthority())){
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads" +
                        "/public_downloads"),Long.valueOf(docId));
                imagePath = getImagePath(contentUri,null);
            }
        }else if("content".equalsIgnoreCase(uri.getScheme())){
            imagePath = getImagePath(uri,null);
        }else if("file".equalsIgnoreCase(uri.getScheme())){
            imagePath = uri.getPath();
        }
        displayImage(imagePath);
    }
//这里路径我写错了依旧能打开,想了想“”里面的东西应该是没问题的,
}

总结:首先注意,声明权限,是必须的,

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

说是4.4之后不再需要声明权限也能进入,但是没有这个权限,在我6.0的安卓机上程序无法进入,所以应该是必不可少的。

其次,需要声明内容提供器

<provider
            android:authorities="com.example.chenxuanhe.cameratest"
            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>

由于android:authorities=”com.example.chenxuanhe.cameratest”的参数需要和代码中if (Build.VERSION.SDK_INT >= 24) {
imageUri = FileProvider.getUriForFile(MainActivity.this, “com.example.chenxuanhe.” +”cameratest”, outputImage);中的第二个参数要一致。
然后android:resource=”@xml/file_paths”/>这个资源文件需要自己在res里面创建一个xml文件,再在里面创建file_paths.xml文件,文件中代码为

<?xml version = "1.0" encoding = "utf-8"?>
<paths xmlns:android = "http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path=""/>
</paths>

这样才能完整完成整个操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值