package com.example.thinkpad.camera; 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.media.ImageWriter; import android.net.Uri; import android.os.Build; import android.provider.DocumentsContract; import android.provider.MediaStore; 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.os.Bundle; 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.pictrue); 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 { openAblum(); } } }); 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= FileProvider.getUriForFile(MainActivity.this,"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,TAKE_PHOTO); } }); } private void openAblum(){ 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){ openAblum(); }else{ Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show(); } break; default: } } 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 (FileNotFoundException e){ e.printStackTrace(); } } break; case CHOOSE_PHOTO: if(resultCode==RESULT_OK){ //判断手机系统版本号 if(Build.VERSION.SDK_INT>=19){ //4.4及以上系统使用这个方法处理图片 handleImageOnKitkat(data); }else{ //4.4以下系统使用这个方法处理图片 handleImageBeforeKitKathy(data); } } break; default: break; } } @TargetApi(19) private void handleImageOnKitkat(Intent data){ String imagePath=null; Uri uri=data.getData(); 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 handleImageBeforeKitKathy(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(); } } }
在上一次拍照的基础上增加一个选取照片按钮
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/take_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Take Photo"/> <Button android:id="@+id/choose_from_album" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Choose From Album"/> <ImageView android:id="@+id/pictrue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"/> </LinearLayout>
其他的文件代码和上次拍照的相同 概不赘述。