package com.qingdaofushan.home.activity; import android.Manifest; import android.content.ContentValues; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.icu.text.SimpleDateFormat; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import androidx.core.os.EnvironmentCompat; import com.qingdaofushan.home.R; import com.qingdaofushan.home.utils.Uri2PathUtil; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Locale; public class CamActivity extends AppCompatActivity { // private ImageView ivCamera; // private ImageView ivPhoto; // 拍照的requestCode private static final int CAMERA_REQUEST_CODE = 0x00000010; // 申请相机权限的requestCode private static final int PERMISSION_CAMERA_REQUEST_CODE = 0x00000012; /** * 用于保存拍照图片的uri */ private Uri mCameraUri; /** * 用于保存图片的文件路径,Android 10以下使用图片路径访问图片 */ private String mCameraImagePath; /** * 是否是Android 10以上手机 */ private boolean isAndroidQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cam); checkPermissionAndCamera(); } /** * 检查权限并拍照。 * 调用相机前先检查权限。 */ private void checkPermissionAndCamera() { int hasCameraPermission = ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.CAMERA); if (hasCameraPermission == PackageManager.PERMISSION_GRANTED) { //有权限,调起相机拍照。 openCamera(); } else { //没有权限,申请权限。 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA_REQUEST_CODE); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_CAMERA_REQUEST_CODE); } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); System.out.println("==================resultCode = " + resultCode); if (requestCode == CAMERA_REQUEST_CODE) { if (resultCode == RESULT_OK) { String uploadpath = Uri2PathUtil.getRealPathFromUri(this, mCameraUri); Log.e("pwx", "onActivityResult: " + uploadpath); finish(); // ivPhoto.setImageURI(mCameraUri); } else { Toast.makeText(this, "取消", Toast.LENGTH_LONG).show(); } } } /** * 处理权限申请的回调。 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSION_CAMERA_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //允许权限,有调起相机拍照。 openCamera(); } else { //拒绝权限,弹出提示框。 Toast.makeText(this, "拍照权限被拒绝", Toast.LENGTH_LONG).show(); } } } /** * 调起相机拍照 */ private void openCamera() { Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 判断是否有相机 if (captureIntent.resolveActivity(getPackageManager()) != null) { File photoFile = null; Uri photoUri = null; if (isAndroidQ) { // 适配android 10 photoUri = createImageUri(); } else { try { photoFile = createImageFile(); } catch (IOException e) { e.printStackTrace(); } if (photoFile != null) { mCameraImagePath = photoFile.getAbsolutePath(); System.out.println("path = " + mCameraImagePath); photoUri = FileProvider.getUriForFile(CamActivity.this, "com.qingdaofushan.home.fileprovider", photoFile); } } System.out.println("photoUri = " + photoUri); mCameraUri = photoUri; if (photoUri != null) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { List resInfoList = getPackageManager() .queryIntentActivities(captureIntent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; grantUriPermission(packageName, photoUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } } captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(captureIntent, CAMERA_REQUEST_CODE); } } } /** * 创建图片地址uri,用于保存拍照后的照片 Android 10以后使用这种方法 * * @return 图片的uri */ private Uri createImageUri() { //设置保存参数到ContentValues中 ContentValues contentValues = new ContentValues(); //设置文件名 contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, System.currentTimeMillis() + ""); //兼容Android Q和以下版本 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //android Q中不再使用DATA字段,而用RELATIVE_PATH代替 //TODO RELATIVE_PATH是相对路径不是绝对路径;照片存储的地方为:内部存储/Pictures/preventpro contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/preventpro"); } //设置文件类型 contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/JPEG"); //执行insert操作,向系统文件夹中添加文件 //EXTERNAL_CONTENT_URI代表外部存储器,该值不变 Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); return uri; } /** * 创建保存图片的文件 * * @return * @throws IOException */ private File createImageFile() throws IOException { String imageName = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()) + ".jpg"; // File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); // File storageDir = Environment.getExternalStoragePublicDirectory( // Environment.DIRECTORY_PICTURES); File storageDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Pictures" + File.separator + "abc"); if (!storageDir.exists()) storageDir.mkdirs(); File tempFile = new File(storageDir, imageName); if (!Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(tempFile))) { return null; } return tempFile; } }