第一步:加权限 和依赖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>