调用相机拍照并显示

  1. 设置拍照保存路径并将之转换为Uri
  2. 启动相机,并传递该Uri作为参数
  3. 在保存路径读取照片并显示
private void takePhoto() {        //创建File对象,用于储存拍照后的图片        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.cameraalbumtest.fileprovider", 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);    }

由于在将File转换成Uri过程中需要FileProvider 所以需要在AndroidManifest.xml中声明。

                                 

此Provider需要绑定一个xml文件指定代码可访问的目录。在res目录下新建xml目录并新建file_paths.xml

        

拍照完成后返回,会调用系统的onActivityResult方法,重写该方法,显示图片即可。

@Override    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {        switch (requestCode) {            case TAKE_PHOTO:                if (resultCode == RESULT_OK) {                    try {                        //将拍摄的照片显示出来                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));                        picture.setImageBitmap(bitmap);                    } catch (FileNotFoundException e) {                        e.printStackTrace();                    }                }                break;            case CHOOSE_PHOTO:                if (resultCode == RESULT_OK) {                    handleImageOnKitKat(data);                }                break;            default:                break;        }    }

打开相册选择照片并显示

  1. 获取运行时权限,WRITE_EXTERNAL_STORAGE
  2. 打开相册
  3. 获取选中照片的uri并转换为路径
  4. 显示
private void getPhotoFromAlbum() {        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();        }    }
 @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        switch (requestCode) {            case 1:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    openAlbum();                } else {                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();                }        }    }

检测是否有对应权限,没有的话申请权限,用户确认或拒绝后,系统自动调用onRequestPermissionsResult()方法。

private void openAlbum() {        Intent intent = new Intent("android.intent.action.GET_CONTENT");        intent.setType("image/*");        startActivityForResult(intent, CHOOSE_PHOTO);    }

使用Intent打开相册,用户选择照片后,系统调用onActivityResult(),代码在上面已贴出。

 private void handleImageOnKitKat(Intent data) {        String imagesPath = null;        Uri uri = data.getData();        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;                imagesPath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);            }        }        else if ("content".equalsIgnoreCase(uri.getScheme())) {            imagesPath = getImagePath(uri, null);        } else if ("file".equalsIgnoreCase(uri.getScheme())) {            imagesPath = uri.getPath();        }        displayImage(imagesPath);    }

处理Intent返回的数据,转化为路径,然后显示

    private String getImagePath(Uri uri, String selection) {        String path = null;        //通过Uri和selection来获取真实的图片路径        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;    }     private void displayImage(String imagesPath) {        if (imagesPath != null) {            Bitmap bitmap = BitmapFactory.decodeFile(imagesPath);            picture.setImageBitmap(bitmap);        } else {            Toast.makeText(this, "failed to get image", Toast.LENGTH_LONG).show();        }    }

更多相关文章

  1. ActionBar使用
  2. Flutter
  3. Android命令行用已有的keystore对apk进行签名
  4. android中自定义WebView显示网页或本地html文件
  5. 使用Android(安卓)NDK内置编译器为Android编译Linux应用程序
  6. android 使用SimpleCursorAdapter将SQLite数据显示到ListView
  7. Android(安卓)高仿iReader标签
  8. Android第三方文件选择器aFileChooser使用方法详解
  9. Android下Opengl程序显示文字的简单方法

随机推荐

  1. Android与设计模式(4)外观/桥接/MVP
  2. Android(安卓)- Layout时发生'Unfortunat
  3. Android笔记 从init到SystemServer
  4. Android中MaterialDesign使用 (五)自定义
  5. Android的消息机制
  6. android防止内存溢出浅析
  7. android系统体系结构
  8. init进程【4】——属性服务
  9. Android系列学习:handler,HandlerThread
  10. 狂刷Android范例之2:剪贴板范例