android使用相机和相册简单教程
第一步:加权限 和依赖glide图片加载框架
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
implementation 'com.github.bumptech.glide:glide:4.7.1'
第二步:
创建工具类
public class PhotoUtil { /** * 开始拍照 * @param activity * @param requestCode * @return */ public static String start_camera(Activity activity, int requestCode) { Uri imageUri; // save image in cache path File outputImage = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/lite_mobile/"+System.currentTimeMillis() + ".jpg"); Log.d("outputImage", outputImage.getAbsolutePath()); try { if (outputImage.exists()) { outputImage.delete(); } File out_path = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/lite_mobile/"); if (!out_path.exists()) { out_path.mkdirs(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT >= 24) { // compatible with Android 7.0 or over imageUri = FileProvider.getUriForFile(activity, "com.ych.testtflite.fileprovider", outputImage); } else { imageUri = Uri.fromFile(outputImage); } // set system camera Action Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // set save photo path intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // set photo quality, min is 0, max is 1 intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); activity.startActivityForResult(intent, requestCode); // return image absolute path return outputImage.getAbsolutePath(); } /** * 相册选择 * @param activity * @param requestCode */ public static void use_photo(Activity activity, int requestCode) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); activity.startActivityForResult(intent, requestCode); } }
第三步:
创建main_activity.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="ych.com.camerademo.MainActivity"> <ImageView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/show_image"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="相机" android:id="@+id/btn_camera"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="相册" android:id="@+id/btn_album"/> </LinearLayout>
第四步:创建MainActivity.java
public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getName(); private static final int USE_PHOTO = 1001; private static final int START_CAMERA = 1002; private ImageView show_image; private Button btn_camera; private Button btn_album; private String camera_image_path; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); show_image=findViewById(R.id.show_image); btn_camera=findViewById(R.id.btn_camera); btn_album=findViewById(R.id.btn_album); request_permissions(); btn_album.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PhotoUtil.use_photo(MainActivity.this, USE_PHOTO); } }); btn_camera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { camera_image_path = PhotoUtil.start_camera(MainActivity.this, START_CAMERA); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { String image_path; RequestOptions options = new RequestOptions().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE); if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case USE_PHOTO: if (data == null||options==null) { Log.w(TAG, "user photo data is null"); return; } Log.e("data",data.getData().getPath()); Uri image_uri = data.getData(); Glide.with(MainActivity.this).load(image_uri).apply(options).into(show_image); // get image path from uri //image_path = PhotoUtil.get_path_from_URI(MainActivity.this, image_uri); // predict image //predict_image(image_path); break; case START_CAMERA: // show photo Log.e("path",camera_image_path); Log.e("options",options+"[]"); Glide.with(MainActivity.this).load(new File(camera_image_path)).apply(options).into(show_image); // predict image //predict_image(camera_image_path); break; } } } // request permissions private void request_permissions() { List<String> permissionList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.CAMERA); } if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE); } // if list is not empty will request permissions if (!permissionList.isEmpty()) { ActivityCompat.requestPermissions(this, permissionList.toArray(new String[permissionList.size()]), 1); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 1: if (grantResults.length > 0) { for (int i = 0; i < grantResults.length; i++) { int grantResult = grantResults[i]; if (grantResult == PackageManager.PERMISSION_DENIED) { String s = permissions[i]; Toast.makeText(this, s + " permission was denied", Toast.LENGTH_SHORT).show(); } } } break; } } }
第五步:
android7.0以*问路径配置:需要注册provider
<!-- FileProvider配置访问路径,适配7.0及其以上 --> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.ych.testtflite.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider>
第六步:创建file_paths.xml文件,在res中创建一个xml文件夹,将该文件放入
<?xml version="1.0" encoding="utf-8"?> <resources> <external-path name="images" path="lite_mobile/" /> </resources>