拍照 相册选择 预览
xml界面
项目
代码部分
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final int GET_CAMERA = 1;
private static final int PICK_PHOTO = 2;
private static final int requestCode = 3;
private Button pz_btn, xz_btn;
private ImageView yl_img;
private Uri img_uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化组件
init();
}
//实例化组件
private void init() {
pz_btn = findViewById(R.id.pz_btn);
pz_btn.setOnClickListener(this);
xz_btn = findViewById(R.id.xz_btn);
xz_btn.setOnClickListener(this);
}
//点击事件
@Override
public void onClick(View v) {
switch (v.getId()) {
//摄像头拍照
case R.id.pz_btn:
File pz_photo_img = new File(getExternalCacheDir(), "pz_photo_img.jpg");
//判断,如果有照片,则删除
if (pz_photo_img.exists()) {
pz_photo_img.delete();
} else
//如果系统版本大于7.0,则直接将照片的地址赋值给 img_uri 后续操作使用。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//
// com.example.camera.FileProvider 和 manifest.xml注册中要一样,千万不能写错。唯一性如果有其他一样的地址会报错。
img_uri = FileProvider.getUriForFile(MainActivity.this, "com.example.camera.FileProvider", pz_photo_img);
} else {
img_uri = Uri.fromFile(pz_photo_img);
}
//开启相机拍照
//系统注册 MediaStore.ACTION_IMAGE_CAPTURE_SECURE 。 MediaStore.ACTION_IMAGE_CAPTURE_SECURE也可以
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE_SECURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, img_uri);
startActivityForResult(intent, GET_CAMERA);
break;
//从相册选择一张照片
case R.id.xz_btn:
//
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
} else {
Intent intent1 = new Intent(Intent.ACTION_GET_CONTENT);
intent1.setType("image/*");
startActivityForResult(intent1, PICK_PHOTO);
}
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case GET_CAMERA:
if (resultCode == RESULT_OK) {
try {
//实例化 image View
yl_img = findViewById(R.id.yl_img);
//预览的 imageView旋转90°,显示拍出来的照片才是正的。
yl_img.setRotation(90);
//根据照片地址获取图片
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(img_uri));
//把图片添加到预览的imageview中
yl_img.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
case PICK_PHOTO:
if (resultCode == RESULT_OK) {
//Android4.4版本以上的方法
if (Build.VERSION.SDK_INT >= 19) {
select_one(data);
} else {
//4.4版本以前的方法
select_two(data);
}
}
}
}
//4.4版本以前的方法
private void select_two(Intent data) {
Uri uri = data.getData();
String img_path = getImagePath(uri, null);
//获取图片的方向
int dagree = access_photo_direction(img_path);
path_display_img(img_path, dagree);
}
//Android4.4版本以上的方法,根据不同类型来获取 uri
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void select_one(Intent data) {
String img_path = null;
Uri img_uri = data.getData();
// Document类型
if (DocumentsContract.isDocumentUri(this, img_uri)) {
String documentId = DocumentsContract.getDocumentId(img_uri);
if ("com.android.providers.media.documents".equals(img_uri.getAuthority())) {
String id = documentId.split(":")[1];
//获取数字 id
String select = MediaStore.Images.Media._ID + "=" + id;
img_path = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, select);
} else if ("com.android.providers.downloads.documents".equals(img_uri.getAuthority())) {
Uri uri = ContentUris.withAppendedId(Uri.parse("content: //downloads/public_downloads"), Long.valueOf(documentId));
img_path = getImagePath(uri, null);
}
// content类型
} else if ("content".equalsIgnoreCase(img_uri.getScheme())) {
img_path = getImagePath(img_uri, null);
// file 类型
} else if ("file".equalsIgnoreCase(img_uri.getScheme())) {
img_path = img_uri.getPath();
}
//获取图片的方向
int dagree = access_photo_direction(img_path);
//根据路径获取 图片,以及图片的方向来显示图片
path_display_img(img_path, dagree);
}
//获取 图片 方向
private int access_photo_direction(String img_path) {
int dagree = 0;
ExifInterface exifInterface = null;
try {
exifInterface = new ExifInterface(img_path);
} catch (IOException e) {
e.printStackTrace();
exifInterface = null;
}
if (exifInterface != null) {
int ori = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
switch (ori) {
case ExifInterface.ORIENTATION_ROTATE_90:
dagree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
dagree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
dagree = 270;
break;
default:
dagree = 0;
break;
}
}
return dagree;
}
//根据路径获取 图片,以及图片的方向来显示图片
private void path_display_img(String img_path, int dagree) {
if (img_path != null) {
Bitmap bitmap = BitmapFactory.decodeFile(img_path);
//旋转图片
if (dagree != 0) {
Matrix matrix = new Matrix();
matrix.postRotate(dagree);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
// 将图片添加到预览 imageView 中
yl_img = findViewById(R.id.yl_img);
yl_img.setImageBitmap(bitmap);
} else {
Toast.makeText(this, "获取失败", Toast.LENGTH_SHORT).show();
}
}
//获取选择的图片的路径
private String getImagePath(Uri img_uri, String select) {
String path = null;
Cursor cursor = getContentResolver().query(img_uri, null, select, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
}
权限 、注册部分
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Camera">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:authorities="com.example.camera.FileProvider"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/photo_file_path"></meta-data>
</provider>
</application>