private void initView() { //拍照按钮 photo = (ImageView) findViewById(R.id.photo); Button take_photo = (Button) findViewById(R.id.take_phone); take_photo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //新建一个缓存图片文件 File outputImage = new File(getExternalCacheDir(), "output_image.jpg"); if (outputImage.exists()) {//如果文件存在,则先删除 outputImage.delete(); } try { outputImage.createNewFile();//创建文件 } catch (IOException e) { e.printStackTrace(); } //如果系统是Android7.0及以上,系统认为直接使用真实路径的uri是不安全的, //会抛出FileUriExposedException。FileProvider是一种特殊的内容提供器, //它可以选择性的将封装后的uri共享给外部,从而提高了安全性。 //不过它还需要在manifest文件中声明: /* * <provider android:authorities="com.example.cameraalbumtest.fileprovider"(这里需要与getUriForFile方法中的第二个参数完全一致) android:name="android.support.v4.content.FileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider> * */ //file_path.xml这个资源是用来指定共享uri的,name名字随便,path是具体共享路径,如果为空则将整个sdk共享 /* * <?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 (Build.VERSION.SDK_INT >= 24) { imageUri = FileProvider.getUriForFile(getApplicationContext(), "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, 1); } }); //从相册选择图片按钮 Button pick = (Button) findViewById(R.id.pick_photo); pick.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //判断是否拥有写啥sd卡的权限,有则打开相册,否则申请权限 if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { openAlbum(); } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 100: if (grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED) { openAlbum(); } else { Toast.makeText(this, "没有授权,洗洗睡吧", Toast.LENGTH_SHORT).show(); } break; } } /**打开相册*/ private void openAlbum() { Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); startActivityForResult(intent, 2); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case 1: try { //将拍照的相片路径转换成图片,展示出来 Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); photo.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } break; case 2: //如果系统API大于19即Android4.4以上的系统,选择照片后不是返回的真实的图片的uri需要进一步的解析 if (Build.VERSION.SDK_INT >= 19) { handleImageOnKitKat(data); } else { handleImageBeforeOnKitKat(data); } break; } } } //API大于等于19时解析返回的uri获取真实的图片路径并把图片显示在imageview上的方法 private void handleImageOnKitKat(Intent data) { String imagePath = null; Uri uri = data.getData(); Log.i("zhangdi",uri.toString()); //如果uri是document类型则取出uri的documentID,如果不是则普通方法处理,如果uri的Authority //是media类型,则需要拆分id取出真正的id值,重构uri if (DocumentsContract.isDocumentUri(this, uri)) { String docId = DocumentsContract.getDocumentId(uri); Log.i("zhangdi",docId); 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".equals(uri.getScheme())) { imagePath = getImagePath(uri, null); } else if ("file".equals(uri.getScheme())) { imagePath = uri.getPath(); } displayImage(imagePath); } private void displayImage(String imagePath) { if(!TextUtils.isEmpty(imagePath)) { Bitmap bitmap = BitmapFactory.decodeFile(imagePath); photo.setImageBitmap(bitmap); } else { Toast.makeText(this, "找不到图片路径", Toast.LENGTH_SHORT).show(); } } /**根据uri和查询条件在provider中查询出图片的真实路径*/ private String getImagePath(Uri uri, String selection) { String path = null; 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; } //API小于19时获取图片路径并显示的方法 private void handleImageBeforeOnKitKat(Intent data) { Uri uri = data.getData(); String imagePath = getImagePath(uri, null); displayImage(imagePath); }
Android利用手机拍照和从相册读取照片的方法
最新推荐文章于 2022-08-22 06:30:00 发布