| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- 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<ResolveInfo> 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;
- }
- }
|