android实现模拟微信调用相机和手机图库更换头像

前言

许多APP软件都用到了,手机里选择图库的或者拍照进行头像使用,在这些过程中涉及很多的权限问题,因涉及到用户的隐私层度还是比较深的,需要动态调用权限的方式。小编运用的是Android12版本实现的,经过多次测试加上老师的指导,现以完成此功能。

由于我的权限是没问题的,关于权限不足的问题,请移步。

1.在配置文件中添加权限<在application中>

 
    
    
    

application 中添加 android:requestLegacyExternalStorage="true"
如若android12的 还需在启动项添加 android:exported="true"

2.弹出对话框提示用户拍照或者是通过本地图库选择图片

  private void takePhotoOrSelectPicture() {
        CharSequence[] items = {"拍照", "图库"};// 裁剪items选项

        // 弹出对话框提示用户拍照或者是通过本地图库选择图片
        new AlertDialog.Builder(MainActivity.this)
                .setItems(items, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        switch (which) {
                            // 选择了拍照
                            case 0:
                                // 创建文件保存拍照的图片
                                // 获取图片文件的filePath对象
                                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                                // 指定输出到文件filePath中
                                intent.putExtra(MediaStore.EXTRA_OUTPUT, filePath);
                                // 启动intent开始拍照
                                startActivityForResult(intent, TAKE_PHOTO);
                                break;
                            // 调用系统图库
                            case 1:

                                // 创建Intent,用于打开手机本地图库选择图片
                                Intent intent1 = new Intent(Intent.ACTION_PICK,
                                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                // 启动intent打开本地图库
                                startActivityForResult(intent1, LOCAL_CROP);
                                break;

                        }

                    }
                }).show();
    }

3.拿到返回的数据展示图片

 switch (requestCode) {

            case TAKE_PHOTO:// 拍照
                if (resultCode == RESULT_OK) {

                    Bitmap bitmap = data.getExtras().getParcelable("data");
                    // 展示图片
                    imageView.setImageBitmap(bitmap);
                }
                break;
            case LOCAL_CROP:// 系统图库

                if (resultCode == RESULT_OK) {
                    // 创建intent用于裁剪图片
                    Intent intent1 = new Intent("com.android.camera.action.CROP");
                    // 获取图库所选图片的uri
                    Uri uri = data.getData();
                    intent1.setDataAndType(uri, "image/*");
                    //  设置裁剪图片的宽高
                    intent1.putExtra("outputX", 300);
                    intent1.putExtra("outputY", 300);
                    // 裁剪后返回数据
                    intent1.putExtra("return-data", true);
                    // 启动intent,开始裁剪
                    startActivityForResult(intent1, CROP_PHOTO);
                }

                break;
            case CROP_PHOTO:// 裁剪后展示图片
                if (resultCode == RESULT_OK) {

                        // 展示图库中选择裁剪后的图片
                        if (data != null) {
                            // 根据返回的data,获取Bitmap对象
                            Bitmap bitmap = data.getExtras().getParcelable("data");
                            // 展示图片
                            imageView.setImageBitmap(bitmap);

                        }
                }
                break;

        }

完整代码

package com.fall.imageclean;

import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import java.io.File;

public class MainActivity extends Activity {
    //初始化
    private ImageView imageView;//图片显示的组件
    private RelativeLayout relativeLayout;//点击出现拍照换图片的组件
    private final String filePath = Environment.getExternalStorageDirectory() + File.separator + "output_image.jpg";
    private static final int TAKE_PHOTO = 11;// 拍照
    private static final int CROP_PHOTO = 12;// 裁剪图片
    private static final int LOCAL_CROP = 13;// 本地图库
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //给组件找到对应的id
        imageView = findViewById(R.id.images);
        relativeLayout = findViewById(R.id.top_view);
        relativeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePhotoOrSelectPicture();// 拍照或者调用图库
            }
        });

    }

    private void takePhotoOrSelectPicture() {
        CharSequence[] items = {"拍照", "图库"};// 裁剪items选项

        // 弹出对话框提示用户拍照或者是通过本地图库选择图片
        new AlertDialog.Builder(MainActivity.this)
                .setItems(items, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        switch (which) {
                            // 选择了拍照
                            case 0:
                                // 创建文件保存拍照的图片
                                // 获取图片文件的filePath对象
                                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                                // 指定输出到文件filePath中
                                intent.putExtra(MediaStore.EXTRA_OUTPUT, filePath);
                                // 启动intent开始拍照
                                startActivityForResult(intent, TAKE_PHOTO);
                                break;
                            // 调用系统图库
                            case 1:

                                // 创建Intent,用于打开手机本地图库选择图片
                                Intent intent1 = new Intent(Intent.ACTION_PICK,
                                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                // 启动intent打开本地图库
                                startActivityForResult(intent1, LOCAL_CROP);
                                break;

                        }

                    }
                }).show();
    }

    /**
     * 调用startActivityForResult方法启动一个intent后,
     * 可以在该方法中拿到返回的数据
     * 展示图片
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {

            case TAKE_PHOTO:// 拍照
                if (resultCode == RESULT_OK) {

                    Bitmap bitmap = data.getExtras().getParcelable("data");
                    // 展示图片
                    imageView.setImageBitmap(bitmap);
                }
                break;
            case LOCAL_CROP:// 系统图库

                if (resultCode == RESULT_OK) {
                    // 创建intent用于裁剪图片
                    Intent intent1 = new Intent("com.android.camera.action.CROP");
                    // 获取图库所选图片的uri
                    Uri uri = data.getData();
                    intent1.setDataAndType(uri, "image/*");
                    //  设置裁剪图片的宽高
                    intent1.putExtra("outputX", 300);
                    intent1.putExtra("outputY", 300);
                    // 裁剪后返回数据
                    intent1.putExtra("return-data", true);
                    // 启动intent,开始裁剪
                    startActivityForResult(intent1, CROP_PHOTO);
                }

                break;
            case CROP_PHOTO:// 裁剪后展示图片
                if (resultCode == RESULT_OK) {

                        // 展示图库中选择裁剪后的图片
                        if (data != null) {
                            // 根据返回的data,获取Bitmap对象
                            Bitmap bitmap = data.getExtras().getParcelable("data");
                            // 展示图片
                            imageView.setImageBitmap(bitmap);

                        }
                }
                break;

        }
    }
}

你可能感兴趣的:(android)