关键代码: 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,进行显示。