Andorid之拍照及相册选取照片回显


前言

提示:我们常见的应该就是APP换头像了,可以拍照以及相册选取,虽然这个功能很常见,但很多比较麻烦,今天分享一个简单的实现方法


一、全局变量定义

    private String headStr;//最终上传路径
    private Uri imageUri;//图片路径
    private int REQUEST_CODE = 88;//相机
    private int REQUEST_CODEXC = 99;//相册

二、得到图片后转String路径工具类

  package com.wzj.footprint.utils;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;

import java.io.File;


public class UriToPathUtil {
    
    


    /**
     *Uri 转 path
     */
    public static String getPathFromUri(Context context, Uri uri) {
    
    
        String path = null;
        if (DocumentsContract.isDocumentUri(context, uri)) {
    
    
            //如果是document类型的Uri,通过document id处理,内部会调用Uri.decode(docId)进行解码
            String docId = DocumentsContract.getDocumentId(uri);
            //primary:Azbtrace.txt
            //video:A1283522
            String[] splits = docId.split(":");
            String type = null, id = null;
            if(splits.length == 2) {
    
    
                type = splits[0];
                id = splits[1];
            }
            switch (uri.getAuthority()) {
    
    
                case "com.android.externalstorage.documents":
                    if("primary".equals(type)) {
    
    
                        path = Environment.getExternalStorageDirectory() + File.separator + id;
                    }
                    break;
                case "com.android.providers.downloads.documents":
                    if("raw".equals(type)) {
    
    
                        path = id;
                    } else {
    
    
                        Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
                        path = getMediaPathFromUri(context, contentUri, null, null);
                    }
                    break;
                case "com.android.providers.media.documents":
                    Uri externalUri = null;
                    switch (type) {
    
    
                        case "image":
                            externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                            break;
                        case "video":
                            externalUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                            break;
                        case "audio":
                            externalUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                            break;
                    }
                    if(externalUri != null) {
    
    
                        String selection = "_id=?";
                        String[] selectionArgs = new String[]{
    
     id };
                        path = getMediaPathFromUri(context, externalUri, selection, selectionArgs);
                    }
                    break;
            }
        } else if (ContentResolver.SCHEME_CONTENT.equalsIgnoreCase(uri.getScheme())) {
    
    
            path = getMediaPathFromUri(context, uri, null, null);
        } else if (ContentResolver.SCHEME_FILE.equalsIgnoreCase(uri.getScheme())) {
    
    
            //如果是file类型的Uri(uri.fromFile),直接获取图片路径即可
            path = uri.getPath();
        }else {
    
    
            path = uri.getPath();
        }
        //确保如果返回路径,则路径合法
        return path == null ? null : (new File(path).exists() ? path : null);
    }



    private static String getMediaPathFromUri(Context context, Uri uri, String selection, String[] selectionArgs) {
    
    
        String path;
        String authroity = uri.getAuthority();
        path = uri.getPath();
        String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        if(!path.startsWith(sdPath)) {
    
    
            int sepIndex = path.indexOf(File.separator, 1);
            if(sepIndex == -1) path = null;
            else {
    
    
                path = sdPath + path.substring(sepIndex);
            }
        }

        if(path == null || !new File(path).exists()) {
    
    
            ContentResolver resolver = context.getContentResolver();
            String[] projection = new String[]{
    
     MediaStore.MediaColumns.DATA };
            Cursor cursor = resolver.query(uri, projection, selection, selectionArgs, null);
            if (cursor != null) {
    
    
                if (cursor.moveToFirst()) {
    
    
                    try {
    
    
                        int index = cursor.getColumnIndexOrThrow(projection[0]);
                        if (index != -1) path = cursor.getString(index);
                        Log.i("Uri 转 path ", "getMediaPathFromUri query " + path);
                    } catch (IllegalArgumentException e) {
    
    
                        e.printStackTrace();
                        path = null;
                    } finally {
    
    
                        cursor.close();
                    }
                }
            }
        }
        return path;
    }




}

三、onActivityResult返回值

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
    
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
    
    
            return;
        }
        if (requestCode == REQUEST_CODEXC) {
    
    //相册
            imageUri = data.getData(); //获取系统返回的照片的Uri
//            Bitmap bitmap = null;
//            try {
    
    
//                bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
//                imag_logo.setImageBitmap(bitmap);
//            } catch (FileNotFoundException e) {
    
    
//                e.printStackTrace();
//            }
            headStr = UriToPathUtil.getPathFromUri(PersonalInformation.this, imageUri);//将Uri转path;
            System.out.println("上传路径返回值打印--相册:" + headStr);
            OSSImag(headStr);//oss上传
        } else {
    
    //相机
            headStr = UriToPathUtil.getPathFromUri(PersonalInformation.this, imageUri);//将Uri转path;
            System.out.println("上传路径返回值打印--拍照:" + headStr);
            OSSImag(headStr);
        }
    }

四、拍照及相册选取

1.拍照

代码如下(示例):

  // 创建File对象,用于存储拍照后的图片
                //存放在手机SD卡的应用关联缓存目录下
                File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
               /* 从Android 6.0系统开始,读写SD卡被列为了危险权限,如果将图片存放在SD卡的任何其他目录,
                 都要进行运行时权限处理才行,而使用应用关联 目录则可以跳过这一步
                 */
                try {
    
    
                    if (outputImage.exists()) {
    
    
                        outputImage.delete();
                    }
                } catch (Exception e) {
    
    
                    e.printStackTrace();
                }
                /*
                 7.0系统开始,直接使用本地真实路径的Uri被认为是不安全的,会抛 出一个FileUriExposedException异常。
                 而FileProvider则是一种特殊的内容提供器,它使用了和内 容提供器类似的机制来对数据进行保护,
                 可以选择性地将封装过的Uri共享给外部,从而提高了 应用的安全性
                 */
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    
    
                    //大于等于版本24(7.0)的场合
                    imageUri = FileProvider.getUriForFile(PersonalInformation.this, "com.wzj.footprint.fileprovider", outputImage);
                } else {
    
    
                    //小于android 版本7.0(24)的场合
                    imageUri = Uri.fromFile(outputImage);
                }
                //启动相机程序
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                //MediaStore.ACTION_IMAGE_CAPTURE = android.media.action.IMAGE_CAPTURE
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, REQUEST_CODE);

2.相册

代码如下(示例):

//在这里跳转到手机系统相册里面
//在这里跳转到手机系统相册里面
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODEXC);

五、权限

<!-- 拍照选取相册图片需要权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

总结

     有没有感觉很简单,大致流程就是这样,1:权限  2:跳转拍照或者相册  3:拿返回值进行显示。an

猜你喜欢

转载自blog.csdn.net/Android_Cll/article/details/125541884