android 手机拍照、相册选择照片并显示

关键代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn1;

    private Uri imageUri;

    private ImageView picture;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1 = (Button)findViewById(R.id.btn1);   //发送通知
        Button takePhoto = (Button)findViewById(R.id.takePhoto);//拍照
        Button selectPhoto = (Button)findViewById(R.id.selectPhoto);//相册选择
        picture = (ImageView)findViewById(R.id.image);
        btn1.setOnClickListener(this);
        takePhoto.setOnClickListener(this);
        selectPhoto.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.btn1:

                Intent intent = new Intent(this,NotificationActivity.class);
                PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
                NotificationManager manger = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Notification notification = new NotificationCompat.Builder(this)
                        .setContentTitle("This is content title")
                        .setContentText("this is content text")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentIntent(pi)
                        .setAutoCancel(true)
                        .setVibrate(new long[]{0,1000})
                        .build();
                manger.notify(1,notification);
                break;

            case R.id.takePhoto:
                File outputImage = new File(Environment.getExternalStorageDirectory(),
                        "tempImage" + ".jpg");
                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                Intent intent1 = new Intent("android.media.action.IMAGE_CAPTURE");

                if (Build.VERSION.SDK_INT < 24) {
                    // 从文件中创建uri
                    imageUri = Uri.fromFile(outputImage);
                    intent1.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                } else {
                    //兼容android7.0 使用共享文件的形式
                    ContentValues contentValues = new ContentValues(1);
                    contentValues.put(MediaStore.Images.Media.DATA, outputImage.getAbsolutePath());
                    //检查是否有存储权限,以免崩溃

                    if(!checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) return;
                    imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
                    intent1.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                }
                startActivityForResult(intent1, 1);
                break;

            case R.id.selectPhoto:
                      Intent intent2 = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                      startActivityForResult(intent2,2);

            default:
                break;

        }
    }

    private boolean checkPermission( String permissions){
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //申请WRITE_EXTERNAL_STORAGE权限
            Toast.makeText(this,"请开启存储权限",Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;


    }
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    setImage(imageUri);
                }
                break;
            case 2:
                if (resultCode == RESULT_OK) {

                        Uri uri = data.getData();
                        setImage(uri);

                }

        }
    }

    private void setImage(Uri uri){

        try {
            Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                    .openInputStream(uri));
            picture.setImageBitmap(bitmap);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}

思路解析:

给button按钮增加点击事件,调用摄像头

1、首先这里创建了一个 File对象,用于存储摄像头拍下的图片,这里我们把图片命名为 tempImage.jpg ,并 将 它 存 放 在 手 机 SD 卡 的 根 目 录 下 , 调 用 Environment 的 getExternalStorageDirectory()方法获取到的就是手机 SD 卡的根目录 
2、然后再调用 Uri 的 fromFile()方法将 File 对象转换成 Uri对象,这个 Uri对象标识着 tempImage.jpg 这张图片 的唯一地址 
3、接着构建出一个Intent对象,并将这个Intent的action指定为android.media.action. IMAGE_CAPTURE,再调用 Intent的 putExtra()方法指定图片的输出地址,这里填入刚刚得 到的 Uri 对象,最后调用 startActivityForResult()来启动活动 
4、由于我们使用的是一个隐式 Intent,系统会找出能够响应这个 Intent的活动去启动,这样照相机程序就会被打开,拍下的 照片将会输出到 tempImage.jpg中 
5、我们是使用 startActivityForResult()来启动活动的,因此拍完照后会有结果返回 到 onActivityResult()方法中。 

6、最后将照片uri转化为Bitmap,进行显示。

猜你喜欢

转载自blog.csdn.net/wangpengjie2016/article/details/82185299