2018-12-26 14:51:32 weixin_44247225 阅读数 97
  • AndroidStudio开发APP-脸脸[单机版]

    本项目可拓展为适用于人脸识别、人脸签到等相关场景或业务中。【项目源码放在最后一节的课件里了】 功能描述 通过选择相册中两张的人脸图片,进行人脸识别,并给出匹配度的值,一般大于80%就可认为是同一个人。数值可以根据具体的需求自行设置和调节。 技术分析 界面显示 UI布局 网络判断 Service+广播 圆形图像 自定义控件 大图片正常显示 图像处理 图片存储 文件存储 退出时扫尾 缓存清除 第三方支持__免费 功能需求 需要去注册,保密哦 百度 人脸识别对比 科大讯飞 在线声音播放 授课方式: 手把手教学,一步一步地阶梯式学习。 PPT统揽全局 效果演示 功能实现

    86 人正在学习 去看看 朱松

在android开发中选择图片的方式大致可以分类两种,一种是从手机相册获取,另外一种则是通过调用手机拍照获得

  • 手机相册中获取,这种方式需要读取存储卡的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 相机拍照获取,需要存储卡写入权限以及摄像头权限,并且调用系统相机还涉及到一个android 7.0应用间文件共享的问题,可根据之前的适配Android7.0应用间文件共享FileProvider 方式解决,此处不做多余解释
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>

一.手机相册中获取,在android6.0以上需要处理权限动态申请的问题

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    //未授权,申请授权(从相册选择图片需要读取存储卡的权限)
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, RC_CHOOSE_PHOTO);
                } else {
                    //已授权,获取照片
                    choosePhoto();
                }

/**
权限申请结果回调
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case RC_TAKE_PHOTO:   //拍照权限申请返回
                if (grantResults.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    takePhoto();
                }
                break;
            case RC_CHOOSE_PHOTO:   //相册选择照片权限申请返回
                choosePhoto();
                break;
        }
    }
1.跳转系统相册获取图片的代码:
public static final int RC_CHOOSE_PHOTO = 2;

private void choosePhoto() {
        Intent intentToPickPic = new Intent(Intent.ACTION_PICK, null);
        intentToPickPic.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intentToPickPic, RC_CHOOSE_PHOTO);
    }
2. 系统相册获取图片结果返回,这里使用Glide来显示图片
@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case RC_CHOOSE_PHOTO:
                Uri uri = data.getData();
                String filePath = FileUtil.getFilePathByUri(this, uri);

                if (!TextUtils.isEmpty(filePath)) {
                    RequestOptions requestOptions1 = new RequestOptions().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE);
                    //将照片显示在 ivImage上
                   Glide.with(this).load(filePath).apply(requestOptions1).into(ivImage);
                }
                break;
        }
    }

二.拍照选择图片,也同样需要处理权限动态申请问题,与上面一样,不多加解释,下面是调用相机拍照的代码

    public static final int RC_TAKE_PHOTO = 1;

    private String mTempPhotoPath;
    private Uri imageUri;

    private void takePhoto() {
        Intent intentToTakePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File fileDir = new File(Environment.getExternalStorageDirectory() + File.separator + "photoTest" + File.separator);
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }

        File photoFile = new File(fileDir, "photo.jpeg");
        mTempPhotoPath = photoFile.getAbsolutePath();
        imageUri = FileProvider7.getUriForFile(this, photoFile);
        intentToTakePhoto.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intentToTakePhoto, RC_TAKE_PHOTO);
    }

相机拍照返回结果:

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case RC_TAKE_PHOTO:
                RequestOptions requestOptions = new RequestOptions().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE);
                //将图片显示在ivImage上
                Glide.with(this).load(mTempPhotoPath).apply(requestOptions).into(ivImage);
                break;
        }
    }

三.以上两步完成了从相机拍照选择图片以及从相册选择图片两种方式,但是在从相册选择照片的返回结果处理中还涉及到了从URI获取图片真实路径的方法 String filePath = FileUtil.getFilePathByUri(this, uri); 没有解释,从URI中获取图片的真实路径,不同机型的方式不同,下面是我自己使用过很多次,在多种手机的机型上面都可以正确获取真实路径的工具类

public class FileUtil {
    /**
     * 根据URI获取文件真实路径(兼容多张机型)
     * @param context
     * @param uri
     * @return
     */
    public static String getFilePathByUri(Context context, Uri uri) {
        if ("content".equalsIgnoreCase(uri.getScheme())) {

            int sdkVersion = Build.VERSION.SDK_INT;
            if (sdkVersion >= 19) { // api >= 19
                return getRealPathFromUriAboveApi19(context, uri);
            } else { // api < 19
                return getRealPathFromUriBelowAPI19(context, uri);
            }
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return null;
    }

    /**
     * 适配api19及以上,根据uri获取图片的绝对路径
     *
     * @param context 上下文对象
     * @param uri     图片的Uri
     * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
     */
    @SuppressLint("NewApi")
    private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {
        String filePath = null;
        if (DocumentsContract.isDocumentUri(context, uri)) {
            // 如果是document类型的 uri, 则通过document id来进行处理
            String documentId = DocumentsContract.getDocumentId(uri);
            if (isMediaDocument(uri)) { // MediaProvider
                // 使用':'分割
                String type = documentId.split(":")[0];
                String id = documentId.split(":")[1];

                String selection = MediaStore.Images.Media._ID + "=?";
                String[] selectionArgs = {id};

                //
                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;
                }

                filePath = getDataColumn(context, contentUri, selection, selectionArgs);
            } else if (isDownloadsDocument(uri)) { // DownloadsProvider
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
                filePath = getDataColumn(context, contentUri, null, null);
            }else if (isExternalStorageDocument(uri)) {
                // ExternalStorageProvider
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                if ("primary".equalsIgnoreCase(type)) {
                    filePath = Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            }else {
                //Log.e("路径错误");
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            // 如果是 content 类型的 Uri
            filePath = getDataColumn(context, uri, null, null);
        } else if ("file".equals(uri.getScheme())) {
            // 如果是 file 类型的 Uri,直接获取图片对应的路径
            filePath = uri.getPath();
        }
        return filePath;
    }

    /**
     * 适配api19以下(不包括api19),根据uri获取图片的绝对路径
     *
     * @param context 上下文对象
     * @param uri     图片的Uri
     * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
     */
    private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {
        return getDataColumn(context, uri, null, null);
    }

    /**
     * 获取数据库表中的 _data 列,即返回Uri对应的文件路径
     *
     * @return
     */
    private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
        String path = null;

        String[] projection = new String[]{MediaStore.Images.Media.DATA};
        Cursor cursor = null;
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
                path = cursor.getString(columnIndex);
            }
        } catch (Exception e) {
            if (cursor != null) {
                cursor.close();
            }
        }
        return path;
    }

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

    private 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
     */
    private static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }
}
2017-08-02 17:49:16 htwhtw123 阅读数 394
  • AndroidStudio开发APP-脸脸[单机版]

    本项目可拓展为适用于人脸识别、人脸签到等相关场景或业务中。【项目源码放在最后一节的课件里了】 功能描述 通过选择相册中两张的人脸图片,进行人脸识别,并给出匹配度的值,一般大于80%就可认为是同一个人。数值可以根据具体的需求自行设置和调节。 技术分析 界面显示 UI布局 网络判断 Service+广播 圆形图像 自定义控件 大图片正常显示 图像处理 图片存储 文件存储 退出时扫尾 缓存清除 第三方支持__免费 功能需求 需要去注册,保密哦 百度 人脸识别对比 科大讯飞 在线声音播放 授课方式: 手把手教学,一步一步地阶梯式学习。 PPT统揽全局 效果演示 功能实现

    86 人正在学习 去看看 朱松

使用Android系统相册,打开相册,选择图片,并裁剪图片,显示图片

访问内存静态权限:

<!--写入数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--创建/删除文件的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <!--读取数据权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

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

实现代码:

public class MainActivity extends AppCompatActivity {

    public static final int REQUEST_CODE_CHOOSE_IMAGE = 1;
    public static final int REQUEST_CODE_CROP_IMAGE = 2;
    private ImageView picture;
    private Uri iconUri;
    private Uri cropImageUri;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestAllPower();//获取动态权限
        picture = (ImageView) findViewById(R.id.picture);
    }
//按钮点击事件
    public void click(View v) {
        Intent intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(intent, REQUEST_CODE_CHOOSE_IMAGE);
    }

    //请求应用所需所有权限
    public void requestAllPower() {

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);

    }

    /**
     * 裁减图片操作
     *
     * @param
     */
    private void startCropImage(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // 使图片处于可裁剪状态
        intent.putExtra("crop", "true");
        // 裁剪框的比例(根据需要显示的图片比例进行设置)
        if (Build.MANUFACTURER.contains("HUAWEI")) {
        //硬件厂商为华为的,默认是圆形裁剪框,这里让它无法成圆形
            intent.putExtra("aspectX", 9999);
            intent.putExtra("aspectY", 9998);
        }else{
       //其他手机一般默认为方形
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
        }

        // 设置裁剪区域的形状,默认为矩形,也可设置为圆形,可能无效
        //intent.putExtra("circleCrop", true);

        // 让裁剪框支持缩放
        intent.putExtra("scale", true);

        // 传递原图路径
        File cropFile = new File(Environment.getExternalStorageDirectory() + "/crop_image.jpg");


        try {
            if (cropFile.exists()) {
                cropFile.delete();
            }
            cropFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        cropImageUri = Uri.fromFile(cropFile);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, cropImageUri);

        // 设置图片的输出格式
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        // return-data=true传递的为缩略图,小米手机默认传递大图,所以会导致onActivityResult调用失败
        intent.putExtra("return-data", false);

        startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        if (intent != null) {
            switch (requestCode) {
                // 将选择的图片进行裁剪
                case REQUEST_CODE_CHOOSE_IMAGE:
                    if (intent.getData() != null) {
                        iconUri = intent.getData();
                        startCropImage(iconUri);
                    }
                    break;
                case REQUEST_CODE_CROP_IMAGE:
                    if (resultCode == RESULT_OK) {
                        try {
                            Bitmap bitmap = BitmapFactory.decodeStream
                                    (getContentResolver()
                                            .openInputStream(cropImageUri));
                            picture.setImageBitmap(bitmap); // 将裁剪后的照片显示出来
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                default:
                    break;

            }
        }
    }
}

在custom Phone 7.1.0 -API 25 genymotion模拟器上运行效果:
在

参考文章

Android之图片选择与裁剪(有一些错误):
http://juhonggang.github.io/2016/05/09/Android%E4%B9%8B%E5%9B%BE%E7%89%87%E9%80%89%E6%8B%A9%E4%B8%8E%E8%A3%81%E5%89%AA/

android.os.Build的一些使用方法
http://blog.csdn.net/ioiol/article/details/45535601

一种简单的写法,但不支持裁剪,亲测可用:
http://viralpatel.net/blogs/pick-image-from-galary-android-app/

2019-01-28 09:59:13 u011063085 阅读数 457
  • AndroidStudio开发APP-脸脸[单机版]

    本项目可拓展为适用于人脸识别、人脸签到等相关场景或业务中。【项目源码放在最后一节的课件里了】 功能描述 通过选择相册中两张的人脸图片,进行人脸识别,并给出匹配度的值,一般大于80%就可认为是同一个人。数值可以根据具体的需求自行设置和调节。 技术分析 界面显示 UI布局 网络判断 Service+广播 圆形图像 自定义控件 大图片正常显示 图像处理 图片存储 文件存储 退出时扫尾 缓存清除 第三方支持__免费 功能需求 需要去注册,保密哦 百度 人脸识别对比 科大讯飞 在线声音播放 授课方式: 手把手教学,一步一步地阶梯式学习。 PPT统揽全局 效果演示 功能实现

    86 人正在学习 去看看 朱松

Android从相册选取视频
https://www.cnblogs.com/wzqnxd/p/10011664.html
说得听简明扼要

2017-02-04 14:12:01 SunFlower_12 阅读数 1391
  • AndroidStudio开发APP-脸脸[单机版]

    本项目可拓展为适用于人脸识别、人脸签到等相关场景或业务中。【项目源码放在最后一节的课件里了】 功能描述 通过选择相册中两张的人脸图片,进行人脸识别,并给出匹配度的值,一般大于80%就可认为是同一个人。数值可以根据具体的需求自行设置和调节。 技术分析 界面显示 UI布局 网络判断 Service+广播 圆形图像 自定义控件 大图片正常显示 图像处理 图片存储 文件存储 退出时扫尾 缓存清除 第三方支持__免费 功能需求 需要去注册,保密哦 百度 人脸识别对比 科大讯飞 在线声音播放 授课方式: 手把手教学,一步一步地阶梯式学习。 PPT统揽全局 效果演示 功能实现

    86 人正在学习 去看看 朱松

1、从Android系统相册选择一张图片getImageFromAlbum():

    /**
     * 从图库获得照片
     */
    protected void getImageFromAlbum() {
        isImgs = true;
        // MainApplication.changeSettingStateus = true;
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");// 相片类型
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 360);
        intent.putExtra("outputY", 360);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);
        // intent.putExtra("outputFormat",
        // Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection
        startActivityForResult(intent, 1);
    }

2、在onActivityResult()方法中:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {

            String text;
            switch (requestCode) {
            case 1:
                Uri selectedImage = data.getData();

                CutPic(selectedImage);

                break;
            case 3:// 对图片进行剪切

                if (data != null) {
                    Bitmap bitmap = data.getParcelableExtra("data");

                    temps = zoomImage(bitmap, 360, 360);

                    // 上传图片
                    uploadImg(temps);

                }
                break;

            default:
                break;
            }

        }

    }

3、图片剪切 CutPic(selectedImage);

    /**
     * 将图片裁剪到指定大小
     * 
     * @param uri
     * @param size
     * @param flag
     */
    public void CutPic(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", true);// 设置Intent中的view是可以裁剪的
        // 设置宽高比
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // 设置裁剪图片的宽高
        intent.putExtra("outputX", 360);
        intent.putExtra("outputY", 360);
        intent.putExtra("outputFormat", "JPEG");// 图片格式
        // 设置是否返回数据
        intent.putExtra("return-data", true);
        // 开启一个带有返回值的Activity,请求码为3
        startActivityForResult(intent, 3);

    }

4、图片压缩剪切zoomImage(bitmap, 360, 360);

/***
     * 图片的缩放方法
     * 
     * @param bgimage
     *            :源图片资源
     * @param newWidth
     *            :缩放后宽度
     * @param newHeight
     *            :缩放后高度
     * @return
     */
    public static Bitmap zoomImage(Bitmap bgimage, double newWidth,
            double newHeight) {
        // 获取这个图片的宽和高
        float width = bgimage.getWidth();
        float height = bgimage.getHeight();
        // 创建操作图片用的matrix对象
        Matrix matrix = new Matrix();
        // 计算宽高缩放率
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 缩放图片动作
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
                (int) height, matrix, true);
        return bitmap;
    }

5、上传图片文件至服务器uploadImg(bitMaps);


    /**
     * 上传图片
     * 
     * @param bitP
     */
    private void uploadImg(final Bitmap bitP) {
        // 将Bitmap转换成字符串
        String string = null;
        ByteArrayOutputStream bStream = new ByteArrayOutputStream();
        bitP.compress(CompressFormat.JPEG, 100, bStream);
        byte[] bytes = bStream.toByteArray();
        string = Base64.encodeToString(bytes, Base64.DEFAULT);
        try {
            bStream.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        //string 文件上传服务器...
    }
2014-11-04 11:36:33 fengyuzhengfan 阅读数 10393
  • AndroidStudio开发APP-脸脸[单机版]

    本项目可拓展为适用于人脸识别、人脸签到等相关场景或业务中。【项目源码放在最后一节的课件里了】 功能描述 通过选择相册中两张的人脸图片,进行人脸识别,并给出匹配度的值,一般大于80%就可认为是同一个人。数值可以根据具体的需求自行设置和调节。 技术分析 界面显示 UI布局 网络判断 Service+广播 圆形图像 自定义控件 大图片正常显示 图像处理 图片存储 文件存储 退出时扫尾 缓存清除 第三方支持__免费 功能需求 需要去注册,保密哦 百度 人脸识别对比 科大讯飞 在线声音播放 授课方式: 手把手教学,一步一步地阶梯式学习。 PPT统揽全局 效果演示 功能实现

    86 人正在学习 去看看 朱松

Android开发之从相册选择照片


请尊重他人的劳动成果,转载请注明出处:Android开发之从相册选择照片  

       我曾在 《Android开发之裁剪照片》一文中介绍过,如何从相册选取照片和拍摄照片并进行裁切,在本篇中主要向介绍从相册选择原生照片(不裁切)。

第一步:向系统发送选择照片的意图。

/**
 * 从相册选择原生的照片(不裁切)
 */
private void selectFromGallery() {
    // TODO Auto-generatedmethod stub
    Intentintent=new Intent();
    intent.setAction(Intent.ACTION_PICK);//Pick an item fromthe data
    intent.setType("image/*");//从所有图片中进行选择
    startActivityForResult(intent, SELECT_ORIGINAL_PIC);   
}

第二步:处理系统返回的结果。 

switch (requestCode) {
case SELECT_ORIGINAL_PIC:
    if (resultCode==RESULT_OK) {//从相册选择照片不裁切
       try {
           Uri selectedImage = data.getData(); //获取系统返回的照片的Uri
           String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
           Cursor cursor =getContentResolver().query(selectedImage, 
                  filePathColumn, null, null, null);//从系统表中查询指定Uri对应的照片
           cursor.moveToFirst(); 
           int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
           String picturePath = cursor.getString(columnIndex);  //获取照片路径
           cursor.close(); 
           Bitmap bitmap= BitmapFactory.decodeFile(picturePath);
           imgShow.setImageBitmap(bitmap);
       } catch (Exception e) {
           // TODO Auto-generatedcatch block
           e.printStackTrace();
       }
    }
    break;
}

代码说明:

       当向系统发送选择照片的意图后,系统或启动相册管理程序,让用户来选择照片,选取好照片之后,系统会返回一个选择照片的Uri,为了获取Uri对应的照片的绝对路径,我们需要向系统的媒体数据框中查找指定Uri对应的图片路径。获取到图片的绝对路径之后,我们就可以做一些操作,比如,将它设置到ImageVew上,上传到网络上等。

最后附上项目完整代码:

package com.jph.cp;

import java.io.File;
import java.io.FileNotFoundException;
import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.database.Cursor;
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.view.View;
import android.widget.ImageView;

/**
 * 从相册选择照片进行裁剪,从相机拍取照片进行裁剪<br>
 * 从相册选择照片(不裁切),并获取照片的路径<br>
 * 拍取照片(不裁切),并获取照片路径
 * @author JPH
 * Date:2014.10.09
 * last modified:2014.11.04
 */
public class MainActivity extends ActionBarActivity {
	/**request Code 从相册选择照片并裁切**/
	private final static int SELECT_PIC=123; 
	/**request Code 从相册选择照片不裁切**/
	private final static int SELECT_ORIGINAL_PIC=126; 
	/**request Code 拍取照片并裁切**/
	private final static int TAKE_PIC=124; 
	/**request Code 拍取照片不裁切**/
	private final static int TAKE_ORIGINAL_PIC=127; 
	/**request Code 裁切照片**/
	private final static int CROP_PIC=125; 
	private Uri imageUri;
	private ImageView imgShow;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//初始化imageUri
		imageUri=Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "test.jpg"));
		imgShow=(ImageView)findViewById(R.id.imgShow);
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		switch (requestCode) {
		case SELECT_PIC:
			if (resultCode==RESULT_OK) {//从相册选择照片并裁切
				try {
					Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));//将imageUri对象的图片加载到内存
					imgShow.setImageBitmap(bitmap);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			break;
		case SELECT_ORIGINAL_PIC:
			if (resultCode==RESULT_OK) {//从相册选择照片不裁切
				try {
					Uri selectedImage = data.getData(); //获取系统返回的照片的Uri 
					String[] filePathColumn = { MediaStore.Images.Media.DATA };  
					Cursor cursor = getContentResolver().query(selectedImage,  
							filePathColumn, null, null, null);//从系统表中查询指定Uri对应的照片
					cursor.moveToFirst();  
					int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
					String picturePath = cursor.getString(columnIndex);  //获取照片路径
					cursor.close();  
					Bitmap bitmap= BitmapFactory.decodeFile(picturePath);
					imgShow.setImageBitmap(bitmap);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			break;
		case TAKE_PIC://拍取照片,并裁切
			if (resultCode==RESULT_OK) {
				cropImageUri(imageUri, 600, 600, CROP_PIC);
			}
		case TAKE_ORIGINAL_PIC://拍取照片
			if (resultCode==RESULT_OK) {
				String imgPath=imageUri.getPath();//获取拍摄照片路径
			}
			break;
		case CROP_PIC://拍取照片
			if (resultCode==RESULT_OK) {
				try {
					Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().
							openInputStream(imageUri));//将imageUri对象的图片加载到内存
					imgShow.setImageBitmap(bitmap);
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			break;
		default:
			break;
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
	/**
	 * 裁剪指定uri对应的照片
	 * @param imageUri:uri对应的照片
	 * @param outputX:裁剪宽
	 * @param outputY:裁剪高
	 * @param requestCode:请求码
	 */
	private void cropImageUri(Uri imageUri, int outputX, int outputY, int requestCode){
	    Intent intent = new Intent("com.android.camera.action.CROP");
	    intent.setDataAndType(imageUri, "image/*");
	    intent.putExtra("crop", "true");
	    intent.putExtra("aspectX", 1);
	    intent.putExtra("aspectY", 1);
	    intent.putExtra("outputX", outputX);
	    intent.putExtra("outputY", outputY);
	    intent.putExtra("scale", true);
	    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
	    intent.putExtra("return-data", false);
	    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
	    intent.putExtra("noFaceDetection", true); // no face detection
	    startActivityForResult(intent, requestCode);
	}

	public void cropPic(View view) {
		switch (view.getId()) {
		case R.id.btnCropFromGallery://从相册选择照片进行裁剪
			cropFromGallery();
			break;
		case R.id.btnCropFromTake://从相机拍取照片进行裁剪
			cropFromTake();
			break;
		case R.id.btnOriginal://从相册选择照片不裁切
			selectFromGallery();
			break;
		case R.id.btnTakeOriginal://从相机拍取照片不裁剪
			selectFromTake();
			break;

		default:
			break;
		}
	}
	/**
	 * 从相册选择原生的照片(不裁切)
	 */
	private void selectFromGallery() {
		// TODO Auto-generated method stub
		Intent intent=new Intent();
		intent.setAction(Intent.ACTION_PICK);//Pick an item from the data
		intent.setType("image/*");//从所有图片中进行选择
		startActivityForResult(intent, SELECT_ORIGINAL_PIC);    
	}
	/**
	 * 从相册选择照片进行裁剪
	 */
	private void cropFromGallery() {
		// TODO Auto-generated method stub		
		Intent intent=new Intent();
		intent.setAction(Intent.ACTION_PICK);//Pick an item from the data
		intent.setType("image/*");//从所有图片中进行选择
		intent.putExtra("crop", "true");//设置为裁切
		intent.putExtra("aspectX", 1);//裁切的宽比例
		intent.putExtra("aspectY", 1);//裁切的高比例
		intent.putExtra("outputX", 600);//裁切的宽度
		intent.putExtra("outputY", 600);//裁切的高度
		intent.putExtra("scale", true);//支持缩放
		intent.putExtra("return-data", false);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将裁切的结果输出到指定的Uri
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//裁切成的图片的格式
		intent.putExtra("noFaceDetection", true); // no face detection
		startActivityForResult(intent, SELECT_PIC);    
	}
	/**
	 * 拍取照片不裁切
	 */
	private void selectFromTake() {
		// TODO Auto-generated method stub
		Intent intent=new Intent();  
		intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照  
		intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI  
		startActivityForResult(intent, TAKE_ORIGINAL_PIC);  
	}	
	/**
	 * 从相机拍取照片进行裁剪
	 */
	private void cropFromTake() {
		// TODO Auto-generated method stub
		Intent intent=new Intent();  
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照  
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI  
        startActivityForResult(intent, TAKE_PIC);  
	}
}

 如果你觉得这篇博文对你有帮助的话,请为这篇博文点个赞吧!也可以关注fengyuzhengfan的博客,收看更多精彩!http://blog.csdn.net/fengyuzhengfan/   


android GalleryModule 相册选择

博文 来自: u014608640
没有更多推荐了,返回首页