Intent选择器,开系统图库选择图片,开相机拍照
来源:互联网 发布:mac软件下载的网站 编辑:程序博客网 时间:2024/05/16 12:07
//开启系统图库 Intent intent1 = new Intent(Intent.ACTION_PICK); intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); //开相机 Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), System.currentTimeMillis() + ".jpg"); path = file.getAbsolutePath(); Uri path = Uri.fromFile(file); intent2.putExtra(MediaStore.EXTRA_OUTPUT, path); //intent选择器 Intent chooser = Intent.createChooser(intent1, "选择头像"); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{intent2}); startActivityForResult(chooser, 100);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == 101) { String filePath = ""; if (data != null) { //图库选图 //对于部分手机来说,在安卓原生的拍照程序基础上做了修改 //导致拍照的照片会随着arg2返回到这里 Uri uri = data.getData(); if (uri != null) { if (!uri.getPath().equals(imageUri.getPath())) { //图库 Cursor cursor = getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null); cursor.moveToNext(); filePath = cursor.getString(0); cursor.close(); } else { //拍照 //拍照的路径依然是cameraPath filePath = cameraPath; } } else { Bundle bundle = data.getExtras(); //bitmap是拍照回来的照片 Bitmap bitmap = (Bitmap) bundle.get("data"); //TODO 将bitmap存储到SD卡 } } else { //相机拍照 filePath = cameraPath; } } super.onActivityResult(requestCode, resultCode, data); }
调用系统的摄像头进行拍照:
第一步:声明个imageUri,以便拍照时返回用
第二步:
//创建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) { //android 7.0后的特性,直接使用fromFile不安全,所以用getUriForFile imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.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);
第三部:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case TAKE_PHOTO: if (resultCode == RESULT_OK) { try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } break; } }第四部:
因为用到了FileProvider,所以需要在manifest中注册
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_path" /> </provider>同时也要为了兼顾旧版本,需要加权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />第五部:创建xml文件夹,并创建file_path文件
<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="" /></paths>
调用系统图库选择图片
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); } else { openAlbum(); }
private void openAlbum() { Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); startActivityForResult(intent, CHOOSE_PHOTO); }
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == 100) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { openAlbum(); } else { Log.i("TAG", "onRequestPermissionsResult: " + "error"); } } }然后在OnActivityResult里面
case CHOOSE_PHOTO: if (resultCode == RESULT_OK) { if (Build.VERSION.SDK_INT >= 19) { handlerImageOnKitKat(data); } else { handlerImageBeforeKitKat(data); } } break;
private void handlerImageOnKitKat(Intent data) { String imagePath = null; Uri uri = data.getData(); if (DocumentsContract.isDocumentUri(this, uri)) { //如果是document类型的uri 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; imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection); } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) { Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId)); imagePath = getImagePath(contentUri, null); } } else if ("content".equalsIgnoreCase(uri.getScheme())) { //content类型 imagePath = getImagePath(uri, null); } else if ("file".equalsIgnoreCase(uri.getScheme())) { //file类型 imagePath = uri.getPath(); } displayImage(imagePath); } private void handlerImageBeforeKitKat(Intent data) { String path = getImagePath(data.getData(), null); displayImage(path); } private void displayImage(String path) { if (path != null) { Bitmap bitmap = BitmapFactory.decodeFile(path); imageView.setImageBitmap(bitmap); } } private String getImagePath(Uri data, String selection) { String path = null; Cursor cursor = getContentResolver().query(data, null, selection, null, null); if (cursor != null) { if (cursor.moveToFirst()) { path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); } cursor.close(); } return path; }
阅读全文
0 0
- Intent选择器,开系统图库选择图片,开相机拍照
- Android调用相机拍照并返回路径和调用系统图库选择图片
- Android调用相机拍照并返回路径和调用系统图库选择图片
- 调用系统相机、图库并选择图片
- iOS 调用相机拍照和选择图库图片 设置头像
- Android 调用系统相机拍照(适配7.0)、从图库选择图片;从数据库读取联系人信息、相册图片
- 调用系统图库,系统相机拍照
- Android启动系统相机,打开图库选择图片
- 调用系统相机拍照与手机图库
- Android调用系统相机拍照,从图库中选择照片,调用系统摄像机录像
- 调用相机拍照或者从图库里选择图片裁剪后设置到界面
- Android开发之调用相机拍照与本地图库选择图片
- Android 图片选择器,相机拍摄和图库选择,并进行裁剪
- Android7.0调用系统相机拍照、相册选择图片、裁剪
- 相机拍照与图库
- 代码库相机图库选择图片
- IOS开发选择图片(相机或者图库)
- 调用系统相机和图库,裁剪图片
- [Android6.0] Reference-RIL 运行框架
- 8.3 单位矩阵和逆矩阵
- lvds屏幕上电闪下白屏
- git日志导出为csv、excel文件
- 并查集
- Intent选择器,开系统图库选择图片,开相机拍照
- Python文件I/O
- 如何用MD_SALES_ORDER_STATUS_REPORT函数从MD04事务码获取概览树(overview tree)数据
- AndRoid EditText相关属性设置
- 电到底是怎么工作的?
- 操作系统与操作系统内核
- Scrapy阅读源码分析<三>
- 机器学习之支持向量机
- 机器学习知识体系