调用摄像头和相册

调用摄像头和相册

  1. 具体代码

    package com.example.cameraalbumtest;
    
    import android.Manifest;
    import android.annotation.TargetApi;
    import android.content.ContentUris;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.DocumentsContract;
    import android.provider.MediaStore;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v4.content.FileProvider;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class MainActivity extends AppCompatActivity {
       public static final int TAKE_PHOTO = 1;
    
       public static final int CHOOSE_PHOTO = 2;
    
       private ImageView picture;
    
       private Uri imageUri;
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
           Button takePhoto = (Button) findViewById(R.id.take_photo);
           Button chooseFromAlbum = (Button) findViewById(R.id.choose_from_album);
           picture = (ImageView) findViewById(R.id.picture);
           takePhoto.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   // 创建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 = Uri.fromFile(outputImage);
                   } else {
                       imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cameraalbumtest.fileprovider", outputImage);
                   }
                   // 启动相机程序
                   Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                   intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                   startActivityForResult(intent, TAKE_PHOTO);
               }
           });
           chooseFromAlbum.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   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();
                   }
               }
           });
       }
    
       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, String[] permissions, 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();
                   }
                   break;
               default:
           }
       }
    
       @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));
                           picture.setImageBitmap(bitmap);
                       } catch (Exception e) {
                           e.printStackTrace();
                       }
                   }
                   break;
               case CHOOSE_PHOTO:
                   if (resultCode == RESULT_OK) {
                       // 判断手机系统版本号
                       if (Build.VERSION.SDK_INT >= 19) {
                           // 4.4及以上系统使用这个方法处理图片
                           handleImageOnKitKat(data);
                       } else {
                           // 4.4以下系统使用这个方法处理图片
                           handleImageBeforeKitKat(data);
                       }
                   }
                   break;
               default:
                   break;
           }
       }
       //重点 uri类型判断和处理
       @TargetApi(19)
       private void handleImageOnKitKat(Intent data) {
           String imagePath = null;
           Uri uri = data.getData();
           Log.d("TAG", "handleImageOnKitKat: uri is " + uri);
           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]; // 解析出数字格式的id
                   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类型的Uri,则使用普通方式处理
               imagePath = getImagePath(uri, null);
           } else if ("file".equalsIgnoreCase(uri.getScheme())) {
               // 如果是file类型的Uri,直接获取图片路径即可
               imagePath = uri.getPath();
           }
           displayImage(imagePath); // 根据图片路径显示图片
       }
    
       private void handleImageBeforeKitKat(Intent data) {
           Uri uri = data.getData();
           String imagePath = getImagePath(uri, null);
           displayImage(imagePath);
       }
    
       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 imagePath) {
           if (imagePath != null) {
               Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
               picture.setImageBitmap(bitmap);
           } else {
               Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
           }
       }
    
    }
    
  2. getExternalCacheDir

    此地址获取的路径是 sdcard/android/data/包名/cache

    此路径可绕过6.0权限,本应用的缓存目录

  3. 7.0兼容

    7.0开始本地真实路径Uri,会被认为是不安全的会抛出异常,需要通过FileProvider对数据进行保护

    AndroidManifest.xml

    <provider
       android:name="android.support.v4.content.FileProvider"
       android:authorities="com.example.cameraalbumtest.fileprovider"
       android:exported="false"
       android:grantUriPermissions="true">
       <meta-data
           android:name="android.support.FILE_PROVIDER_PATHS"
           android:resource="@xml/file_paths" />
    </provider>

    res/xml/file_paths.xml

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
       <external-path name="my_images" path="" />
    </paths>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值