CamActivity.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package com.qingdaofushan.home.activity;
  2. import android.Manifest;
  3. import android.content.ContentValues;
  4. import android.content.Intent;
  5. import android.content.pm.PackageManager;
  6. import android.content.pm.ResolveInfo;
  7. import android.icu.text.SimpleDateFormat;
  8. import android.net.Uri;
  9. import android.os.Build;
  10. import android.os.Bundle;
  11. import android.os.Environment;
  12. import android.provider.MediaStore;
  13. import android.util.Log;
  14. import android.view.View;
  15. import android.widget.ImageView;
  16. import android.widget.Toast;
  17. import androidx.annotation.NonNull;
  18. import androidx.annotation.Nullable;
  19. import androidx.appcompat.app.AppCompatActivity;
  20. import androidx.core.app.ActivityCompat;
  21. import androidx.core.content.ContextCompat;
  22. import androidx.core.content.FileProvider;
  23. import androidx.core.os.EnvironmentCompat;
  24. import com.qingdaofushan.home.R;
  25. import com.qingdaofushan.home.utils.Uri2PathUtil;
  26. import java.io.File;
  27. import java.io.IOException;
  28. import java.util.Date;
  29. import java.util.List;
  30. import java.util.Locale;
  31. public class CamActivity extends AppCompatActivity {
  32. // private ImageView ivCamera;
  33. // private ImageView ivPhoto;
  34. // 拍照的requestCode
  35. private static final int CAMERA_REQUEST_CODE = 0x00000010;
  36. // 申请相机权限的requestCode
  37. private static final int PERMISSION_CAMERA_REQUEST_CODE = 0x00000012;
  38. /**
  39. * 用于保存拍照图片的uri
  40. */
  41. private Uri mCameraUri;
  42. /**
  43. * 用于保存图片的文件路径,Android 10以下使用图片路径访问图片
  44. */
  45. private String mCameraImagePath;
  46. /**
  47. * 是否是Android 10以上手机
  48. */
  49. private boolean isAndroidQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
  50. @Override
  51. protected void onCreate(Bundle savedInstanceState) {
  52. super.onCreate(savedInstanceState);
  53. setContentView(R.layout.activity_cam);
  54. checkPermissionAndCamera();
  55. }
  56. /**
  57. * 检查权限并拍照。
  58. * 调用相机前先检查权限。
  59. */
  60. private void checkPermissionAndCamera() {
  61. int hasCameraPermission = ContextCompat.checkSelfPermission(getApplication(),
  62. Manifest.permission.CAMERA);
  63. if (hasCameraPermission == PackageManager.PERMISSION_GRANTED) {
  64. //有权限,调起相机拍照。
  65. openCamera();
  66. } else {
  67. //没有权限,申请权限。
  68. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
  69. PERMISSION_CAMERA_REQUEST_CODE);
  70. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
  71. PERMISSION_CAMERA_REQUEST_CODE);
  72. }
  73. }
  74. @Override
  75. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  76. super.onActivityResult(requestCode, resultCode, data);
  77. System.out.println("==================resultCode = " + resultCode);
  78. if (requestCode == CAMERA_REQUEST_CODE) {
  79. if (resultCode == RESULT_OK) {
  80. String uploadpath = Uri2PathUtil.getRealPathFromUri(this, mCameraUri);
  81. Log.e("pwx", "onActivityResult: " + uploadpath);
  82. finish();
  83. // ivPhoto.setImageURI(mCameraUri);
  84. } else {
  85. Toast.makeText(this, "取消", Toast.LENGTH_LONG).show();
  86. }
  87. }
  88. }
  89. /**
  90. * 处理权限申请的回调。
  91. *
  92. * @param requestCode
  93. * @param permissions
  94. * @param grantResults
  95. */
  96. @Override
  97. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  98. if (requestCode == PERMISSION_CAMERA_REQUEST_CODE) {
  99. if (grantResults.length > 0
  100. && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  101. //允许权限,有调起相机拍照。
  102. openCamera();
  103. } else {
  104. //拒绝权限,弹出提示框。
  105. Toast.makeText(this, "拍照权限被拒绝", Toast.LENGTH_LONG).show();
  106. }
  107. }
  108. }
  109. /**
  110. * 调起相机拍照
  111. */
  112. private void openCamera() {
  113. Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  114. // 判断是否有相机
  115. if (captureIntent.resolveActivity(getPackageManager()) != null) {
  116. File photoFile = null;
  117. Uri photoUri = null;
  118. if (isAndroidQ) {
  119. // 适配android 10
  120. photoUri = createImageUri();
  121. } else {
  122. try {
  123. photoFile = createImageFile();
  124. } catch (IOException e) {
  125. e.printStackTrace();
  126. }
  127. if (photoFile != null) {
  128. mCameraImagePath = photoFile.getAbsolutePath();
  129. System.out.println("path = " + mCameraImagePath);
  130. photoUri = FileProvider.getUriForFile(CamActivity.this,
  131. "com.qingdaofushan.home.fileprovider", photoFile);
  132. }
  133. }
  134. System.out.println("photoUri = " + photoUri);
  135. mCameraUri = photoUri;
  136. if (photoUri != null) {
  137. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
  138. List<ResolveInfo> resInfoList = getPackageManager()
  139. .queryIntentActivities(captureIntent, PackageManager.MATCH_DEFAULT_ONLY);
  140. for (ResolveInfo resolveInfo : resInfoList) {
  141. String packageName = resolveInfo.activityInfo.packageName;
  142. grantUriPermission(packageName, photoUri,
  143. Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
  144. }
  145. }
  146. captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
  147. captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
  148. startActivityForResult(captureIntent, CAMERA_REQUEST_CODE);
  149. }
  150. }
  151. }
  152. /**
  153. * 创建图片地址uri,用于保存拍照后的照片 Android 10以后使用这种方法
  154. *
  155. * @return 图片的uri
  156. */
  157. private Uri createImageUri() {
  158. //设置保存参数到ContentValues中
  159. ContentValues contentValues = new ContentValues();
  160. //设置文件名
  161. contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, System.currentTimeMillis() + "");
  162. //兼容Android Q和以下版本
  163. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
  164. //android Q中不再使用DATA字段,而用RELATIVE_PATH代替
  165. //TODO RELATIVE_PATH是相对路径不是绝对路径;照片存储的地方为:内部存储/Pictures/preventpro
  166. contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/preventpro");
  167. }
  168. //设置文件类型
  169. contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/JPEG");
  170. //执行insert操作,向系统文件夹中添加文件
  171. //EXTERNAL_CONTENT_URI代表外部存储器,该值不变
  172. Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
  173. return uri;
  174. }
  175. /**
  176. * 创建保存图片的文件
  177. *
  178. * @return
  179. * @throws IOException
  180. */
  181. private File createImageFile() throws IOException {
  182. String imageName = new SimpleDateFormat("yyyyMMdd_HHmmss",
  183. Locale.getDefault()).format(new Date()) + ".jpg";
  184. // File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
  185. // File storageDir = Environment.getExternalStoragePublicDirectory(
  186. // Environment.DIRECTORY_PICTURES);
  187. File storageDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
  188. + File.separator + "Pictures" + File.separator + "abc");
  189. if (!storageDir.exists()) storageDir.mkdirs();
  190. File tempFile = new File(storageDir, imageName);
  191. if (!Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(tempFile))) {
  192. return null;
  193. }
  194. return tempFile;
  195. }
  196. }