Android(安卓)调用相机拍照并显示,打开相册并显示
16lz
2021-01-26
调用相机拍照并显示
- 设置拍照保存路径并将之转换为Uri
- 启动相机,并传递该Uri作为参数
- 在保存路径读取照片并显示
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; } }
打开相册选择照片并显示
- 获取运行时权限,WRITE_EXTERNAL_STORAGE
- 打开相册
- 获取选中照片的uri并转换为路径
- 显示
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(); } }
更多相关文章
- ActionBar使用
- Flutter
- Android命令行用已有的keystore对apk进行签名
- android中自定义WebView显示网页或本地html文件
- 使用Android(安卓)NDK内置编译器为Android编译Linux应用程序
- android 使用SimpleCursorAdapter将SQLite数据显示到ListView
- Android(安卓)高仿iReader标签
- Android第三方文件选择器aFileChooser使用方法详解
- Android下Opengl程序显示文字的简单方法