利用系统相机相册获取单张图片,兼容7.0

本文详细介绍了如何在Android 7.0及以上版本中正确处理相机和相册的权限问题,包括使用FileProvider解决file URI暴露异常、适配不同Android版本的代码实现以及获取图片路径的方法。

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

场景

很多应用都有设置下头像之类的需求,都需要相机相册,但是在6.0的时候加上了运行时权限检测,7.0的时候限制了在应用建共享文件,就是之前相机相册使用的file://URI 不能使用了。

因为在7.0及以上的应用中,android框架执行的(严苛模式)StrictMode API 政策禁止在您的应用外部公开file://URI 。如果一项包含文件URI 的intent离开您的应用,则应用出现故障,并报FileUriExposedException 异常。如果要在应用间共享文件,你应该发送一项content://URI , 并授予URI 临时访问权限。进行此授权的最简单方式是使用FileProvider类。


代码进行的逻辑

因为是帮助理解,所以代码的条理是从业务逻辑出发,顺着相机相册的使用进行代码的编写,提前准备的东西就放在需要使用的时候提及了。Utils–表示该代码是在工具类中使用的,Activity–表示该代码时在调用相机相册的Activity中使用的,Project–表示该代码时项目的配置性代码。


选择相机\相册(Utils)

通过弹窗让用户选择打开相机还是相册,注意这里打开相机的时候有权限检测。

chooseDialog = new AlertDialog.Builder(activity).setItems(
                new String[]{"相机", "相册"},
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        switch (arg1) {
                            case 0:
                                //--检测是否有打开摄像头的权限
                                if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                                    //去请求权限
                                    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, 111);
                                } else {
                                    selectPicFromCamera();
                                }
                                break;
                            case 1:
                                selectPicFromLocal();
                            default:
                                break;
                        }
                    }
                }).create();
        chooseDialog.show();

打开相机 (Utils)

注意要进行android版本判断,如果Build.VERSION.SDK_INT >= Build.VERSION_CODES.N,就用使用FileProvider来获取Uri

 /**
     * 打开相机
     */
    public void selectPicFromCamera() {
        if (!CommUtils.isExitsSdcard()) {
            Toast.makeText(mActivity, "没有SD卡", Toast.LENGTH_SHORT).show();
            return;
        }
        //用户头像缓存目录
        mFileUri.getParentFile().mkdirs();
        Uri imgUri = Uri.fromFile(mFileUri);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //通过FileProvider创建一个content类型的Uri
            imgUri = FileProvider.getUriForFile(mActivity, "zxl.fengye.mallstore.fileprovider", mFileUri);
        }
        //--调用系统相机
        Intent intentCamera = new Intent();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
        }
        intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        //将拍照结果保存至photo_file的Uri中,不保留在相册中
        intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
        mActivity.startActivityForResult(intentCamera, 2);
    }

FileProvider(Project)

可以看到在打开相机的时候我们使用到了FileProvider,这时我们就需要在项目里面设置一些东西,以便让我们能够在代码中使用FileProvider

  • 1.在manifest中添加provider

注意authorities必须要独一无二,不然应用可能会在目标手机上无法安装。一般使用项目包名+自己定义的名字

<!-- 兼容android7.0 -->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="zxl.fengye.mallstore.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
  • 2.资源文件下创建相应的xml文件

这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="external"
            path="" />
        <files-path
            name="files"
            path="" />
        <cache-path
            name="cache"
            path="" />
    </paths>
</resources>

<files-path/>代表的根目录: Context.getFilesDir()
<external-path/>代表的根目录: Environment.getExternalStorageDirectory()
<cache-path/>代表的根目录: getCacheDir()
name 顺便取,代码中不会用到,但是在获取到的uri中会有;
path是允许访问的目录,为空表示可以访问对应根目录下的所有目录和文件
ok, 关于FileProvider的相关配置都完成了。接着看


打开相册(Utils)

 /**
     * 打开相册
     */
    private void selectPicFromLocal() {
        Intent intent1 = new Intent("android.intent.action.PICK");
        intent1.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
        mActivity.startActivityForResult(intent1, 1);
    }

相册相机回调(Activity)

我们通过startActivityForResult打开相机或者相册,所以在拍摄或者选取一张图片后我们需要在Activity中处理。

这里的fileUri 和 fileCropUri 都是全局变量,分别表示拍摄图片的存放位置和剪切后图片的存放位置:

  private File fileUri = new File(CommUtils.getSDPath() + "/FengYe/img/", System.currentTimeMillis() + ".png");
  private File fileCropUri = new File(CommUtils.getSDPath() + "/FengYe/imgCrop/", System.currentTimeMillis() + ".png");
  • 请注意不管是在相册还是相机的回调中都需要进行android版本判断。因为在Build.VERSION.SDK_INT >= Build.VERSION_CODES.N的时候,是需要使用FileProvider来获取Uri 的。

在我们获取到图片的uri之后,我们需要裁剪图片photoUtils.startPhotoZoom(newUri)

    private Uri cropImageUri;
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && data != null) { // 相册
            if (!CommUtils.isExitsSdcard()) {
                Toast.makeText(UserInfoActivity.this, "没有SD卡", Toast.LENGTH_SHORT).show();
                return;
            }
            Uri newUri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                cropImageUri = Uri.fromFile(fileCropUri);
                newUri = Uri.parse(photoUtils.getPath(UserInfoActivity.this, data.getData()));
                newUri = FileProvider.getUriForFile(this, "zxl.fengye.mallstore.fileprovider", new File(newUri.getPath()));
            } else {
                newUri = Uri.parse("file://" + photoUtils.getPath(UserInfoActivity.this, data.getData()));
            }
            photoUtils.startPhotoZoom(newUri);
        } else if (requestCode == 2) {      //拍照
            Uri imgUri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                //通过FileProvider创建一个content类型的Uri
                imgUri = FileProvider.getUriForFile(UserInfoActivity.this, "zxl.fengye.mallstore.fileprovider", fileUri);
            } else {
                imgUri = Uri.fromFile(fileUri);
            }
            photoUtils.startPhotoZoom(imgUri);
        } else if (requestCode == 3 && data != null) {// 裁剪后
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            uploadPic(bitmap, handler);
        }

    }

获取文件路径(Utils)

相册相机回调中有使用到获取文件的路径的方法,photoUtils.getPath(UserInfoActivity.this, data.getData())。需要注意的是在Android4.4之后选取的图片不再返回真实的Uri了,而是封装过的Uri ,所以在4.4以上,就要对这个Uri进行解析。

列举下4.4前后的文件路径的区别:

//4.4以上  content://com.android.providers.media.documents/document/image:3952
//4.4以下  content://media/external/images/media/3951
  • 下面获取文件路径的方法是国外的一位开发者写的,国内多是转载,且有些自己修改后还不能使用了,这里贴出的代码也是我在网上转的,不敢确认是否原文,但在我的项目中使用是没有问题的。
@SuppressLint("NewApi")
    public static String getPath(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{
                        split[1]
                };

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();

            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    //Android 4.4以下版本自动使用该方法
    public static String getDataColumn(Context context, Uri uri, String selection,
                                       String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {
                column
        };

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }


    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }

裁剪图片(Utils)

在我们通过相机或者相册,拍摄或者选取一张图片后,我们需要对其进行裁剪,尤其是现在的手机相机越来越好,拍摄的照片越来越大,轻轻松松好几M。

这里也需要进行Android版本的判断,在Build.VERSION.SDK_INT >= Build.VERSION_CODES.N的时候,我们需要授予URI 临时访问权限intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

/**
     * 兼容android7.0使用
     * @param uri
     */
    public void startPhotoZoom(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 300);
        intent.putExtra("outputY", 300);
        intent.putExtra("return-data", true);
        mActivity.startActivityForResult(intent, 3);
    }

裁剪图片后的处理(Activity)

在相机相册的回调中我们已经看到了,剪裁后的回调处理了,上传的操作应接口而异,这里就不做表述了。至此,相关代码和逻辑已经表述完结了。

 if (requestCode == 3 && data != null) {// 裁剪后
     Bitmap bitmap = (Bitmap) data.getExtras().get("data");
     uploadPic(bitmap, handler);
 }

源码

这里就是极其恐怖的源码地带了,先上工具类ChoosePhotoUtils

public final class ChoosePhotoUtils {
    private AlertDialog chooseDialog;
    private Activity mActivity;
    private File mFileUri;
    private File mFileCropUri;

    public ChoosePhotoUtils(final Activity activity, File fileUri, File fileCropUri) {
        this.mActivity = activity;
        this.mFileUri = fileUri;
        this.mFileCropUri = fileCropUri;

        chooseDialog = new AlertDialog.Builder(activity).setItems(
                new String[]{"相机", "相册"},
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        switch (arg1) {
                            case 0:
                                //--检测是否有打开摄像头的权限
                                if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                                    //去请求权限
                                    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, 111);
                                } else {
                                    selectPicFromCamera();
                                }
                                break;
                            case 1:
                                selectPicFromLocal();
                            default:
                                break;
                        }
                    }
                }).create();
        chooseDialog.show();
    }

    /**
     * 打开相册
     */
    private void selectPicFromLocal() {
        Intent intent1 = new Intent("android.intent.action.PICK");
        intent1.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
        mActivity.startActivityForResult(intent1, 1);
    }


    /**
     * 打开相机
     */
    public void selectPicFromCamera() {
        if (!CommUtils.isExitsSdcard()) {
            Toast.makeText(mActivity, "没有SD卡", Toast.LENGTH_SHORT).show();
            return;
        }
        //用户头像缓存目录
        mFileUri.getParentFile().mkdirs();
        Uri imgUri = Uri.fromFile(mFileUri);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //通过FileProvider创建一个content类型的Uri
            imgUri = FileProvider.getUriForFile(mActivity, "zxl.fengye.mallstore.fileprovider", mFileUri);
        }
        //--调用系统相机
        Intent intentCamera = new Intent();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
        }
        intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        //将拍照结果保存至photo_file的Uri中,不保留在相册中
        intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
        mActivity.startActivityForResult(intentCamera, 2);
    }

    /**
     * 兼容android7.0使用
     * @param uri
     */
    public void startPhotoZoom(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 300);
        intent.putExtra("outputY", 300);
        intent.putExtra("return-data", true);
        mActivity.startActivityForResult(intent, 3);
    }

    /**
     * Android4.4之后选取中的图片不再返回真实的Uri了,而是封装过的Uri,所以在4.4以上,就要对这个Uri进行解析,即上面的PhotoUtils.getPath()方法
     *
     * @param context 上下文对象
     * @param uri     当前相册照片的Uri
     * @return 解析后的Uri对应的String
     */
    //  4.4以上  content://com.android.providers.media.documents/document/image:3952
    //  4.4以下  content://media/external/images/media/3951
    @SuppressLint("NewApi")
    public static String getPath(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{
                        split[1]
                };

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // Return the remote address
            if (isGooglePhotosUri(uri))
                return uri.getLastPathSegment();

            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    //Android 4.4以下版本自动使用该方法
    public static String getDataColumn(Context context, Uri uri, String selection,
                                       String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {
                column
        };

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }


    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri.getAuthority());
    }

}

再上使用的Activity,UserInfoActivity

public class UserInfoActivity extends BaseActivity {

    @Bind(R.id.iv_title_left)
    ImageView ivTitleLeft;
    @Bind(R.id.tv_title)
    TextView tvTitle;
    @Bind(R.id.iv_title_right)
    ImageView ivTitleRight;
    @Bind(R.id.tv_score2award)
    TextView tvScore2award;
    @Bind(R.id.user_img_camera)
    SimpleDraweeView userImgCamera;
    @Bind(R.id.user_ing_info)
    TextView userImgInfo;
    @Bind(R.id.nick_key)
    TextView nickKey;
    @Bind(R.id.nick_value)
    EditText nickValue;
    @Bind(R.id.tel_key)
    TextView telKey;
    @Bind(R.id.tel_value)
    TextView telValue;
    @Bind(R.id.psw_key)
    TextView pswKey;
    @Bind(R.id.psw_value)
    ImageView pswValue;
    @Bind(R.id.address_key)
    TextView addressKey;
    @Bind(R.id.address_value)
    EditText addressValue;
    @Bind(R.id.address_manger_key)
    TextView addressMangerKey;
    @Bind(R.id.address_manger_value)
    ImageView addressMangerValue;
    @Bind(R.id.sex_key)
    TextView sexKey;
    @Bind(R.id.sex_value_women)
    RadioButton sexValueWomen;
    @Bind(R.id.sex_value_man)
    RadioButton sexValueMan;
    @Bind(R.id.viewGorp_ll)
    LinearLayout viewGrop;
    @Bind(R.id.box_all)
    LinearLayout boxAll;
    private String imgName;
    private File outputImage;
    private File fileUri = new File(CommUtils.getSDPath() + "/FengYe/img/", System.currentTimeMillis() + ".png");
    private File fileCropUri = new File(CommUtils.getSDPath() + "/FengYe/imgCrop/", System.currentTimeMillis() + ".png");
    private ChoosePhotoUtils photoUtils;

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

    @Override
    protected void onResume() {
        super.onResume();
        initView();
        loadData();
    }

    private boolean isEdit = false;

    private void initView() {
        tvTitle.setText("个人资料");
        ivTitleRight.setVisibility(View.GONE);
        tvScore2award.setVisibility(View.VISIBLE);
        tvScore2award.setText("完成");
        tvScore2award.setTextColor(getResources().getColor(R.color.colorBlack));
        userImgCamera.getBackground().setAlpha(100);//0~255透明度值
    }

    /**
     * 初始化数据加载
     */
    private int userId = UserInfoUtils.getUserInfoBean().getUserId();

    private void loadData() {
        if (!CommUtils.isNetWorkConnected(UserInfoActivity.this)) {
            ToastUtil.showShort(UserInfoActivity.this, "请检查网络", Gravity.CENTER);
            return;
        }
        //联网请求个人信息
        ...
    }

    /**
     * 修改昵称等信息
     */
    private void resetNickOrSex() {
        if (!CommUtils.isNetWorkConnected(UserInfoActivity.this)) {
            ToastUtil.showShort(UserInfoActivity.this, "请检查网络", Gravity.CENTER);
            return;
        }
       //修改个人信息上传
       ...
    }

    @OnClick({R.id.viewGorp_ll, R.id.iv_title_left, R.id.tv_score2award, R.id.user_img_camera, R.id.tel_value, R.id.psw_value, R.id.address_manger_value})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.viewGorp_ll:
                CommUtils.hideKeyboard(UserInfoActivity.this);
                break;
            case R.id.iv_title_left:
                finish2Main();
                break;
            case R.id.tv_score2award:
                telValue.setMaxEms(6);
                telValue.setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)});
                resetNickOrSex();
                break;
            case R.id.user_img_camera:
                photoUtils = new ChoosePhotoUtils(UserInfoActivity.this, fileUri, fileCropUri);
                break;
            case R.id.tel_value:
                startActivityForResult(new Intent(UserInfoActivity.this, ResetTelActivity.class), 10101);
                break;
            case R.id.psw_value:
                startActivity(new Intent(UserInfoActivity.this, ResetPswActivity.class));//不同的ui
                break;
            case R.id.address_manger_value:
                Intent intent1 = new Intent(UserInfoActivity.this, MangerAddressActivity.class);
                startActivity(intent1);
                break;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 111:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //同意
                    photoUtils.selectPicFromCamera();
                } else {
                    //拒绝
                    Toast.makeText(this, "亲,相机权限被拒绝,\n请在设置中打开", Toast.LENGTH_LONG).show();
                }
                break;
            default:
                break;
        }
    }

    private void finish2Main() {
        Bundle bundle = new Bundle();
        bundle.putString("nick", UserInfoUtils.getUserInfoBean().getNickName());
        bundle.putString("img", UserInfoUtils.getUserInfoBean().getHeadImg());
        UserInfoActivity.this.setResult(RESULT_OK, UserInfoActivity.this.getIntent().putExtra("nickImg", bundle));
        UserInfoActivity.this.finish();
    }

    @Override
    public void onBackPressed() {
        finish2Main();
    }

    //-------------------------------头像处理---------------------------------

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case mConstants.IMG_MSG:
                    Bundle data = msg.getData();
                    String imgPath = (String) data.get("thumPath");
                    resetUserImg(imgPath);
                    break;
                default:
                    break;

            }
        }
    };

    private Uri cropImageUri;

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && data != null) { // 相册
            if (!CommUtils.isExitsSdcard()) {
                Toast.makeText(UserInfoActivity.this, "没有SD卡", Toast.LENGTH_SHORT).show();
                return;
            }
            Uri newUri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                cropImageUri = Uri.fromFile(fileCropUri);
                newUri = Uri.parse(photoUtils.getPath(UserInfoActivity.this, data.getData()));
                newUri = FileProvider.getUriForFile(this, "zxl.fengye.mallstore.fileprovider", new File(newUri.getPath()));
            } else {
                newUri = Uri.parse("file://" + photoUtils.getPath(UserInfoActivity.this, data.getData()));
            }
            photoUtils.startPhotoZoom(newUri);
        } else if (requestCode == 2) {      //拍照
            Uri imgUri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                //通过FileProvider创建一个content类型的Uri
                imgUri = FileProvider.getUriForFile(UserInfoActivity.this, "zxl.fengye.mallstore.fileprovider", fileUri);
            } else {
                imgUri = Uri.fromFile(fileUri);
            }
            photoUtils.startPhotoZoom(imgUri);
        } else if (requestCode == 3 && data != null) {// 裁剪后
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            uploadPic(bitmap, handler);
        }
        //更新修改的Tel
        if (requestCode == 10101 && data != null) {
            String phone = data.getStringExtra("phone");
            if (!TextUtils.isEmpty(phone)) {
                String start = phone.substring(0, 2);
                String end = phone.substring(8, 11);
                telValue.setText(start + "******" + end);
            }
        } else {
            loadData();
        }

    }

    /**
     * -----------上传图片----
     */
    /**
     * 返回json数据
     */
    public void uploadPic(Bitmap bitmap, final Handler handler) {
        if (!CommUtils.isNetWorkConnected(UserInfoActivity.this)) {
            CommUtils.showSafeToast(UserInfoActivity.this, "请检查网络");
            return;
        }
        //上传图片
        ...
    }

    /**
     * 修改用户头像http:
     *
     * @param img
     */
    private void resetUserImg(final String img) {
        if (!CommUtils.isNetWorkConnected(UserInfoActivity.this)) {
            CommUtils.showSafeToast(UserInfoActivity.this, "请检查网络");
            return;
        }
        //修改用户头像
        ...
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值