1.gradle文件
implementation 'com.github.bumptech.glide:glide:3.8.0'
api 'org.devio.takephoto:takephoto_library:4.1.0'
2.配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.leansmall.takephotov410demo">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3.布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btnPhoto1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="拍照" />
<Button
android:id="@+id/btnPhoto2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="从相册获取" />
<Button
android:id="@+id/btnUpdate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="上传" />
<ImageView
android:id="@+id/ivPhoto"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
4.代码文件:
package com.leansmall.takephotov410demo;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ContextWrapper;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import org.devio.takephoto.app.TakePhoto;
import org.devio.takephoto.app.TakePhotoActivity;
import org.devio.takephoto.compress.CompressConfig;
import org.devio.takephoto.model.CropOptions;
import org.devio.takephoto.model.TResult;
import org.devio.takephoto.model.TakePhotoOptions;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends TakePhotoActivity {
private Button btnPhoto;
private Button btnPhotos;
private Button btnUpdate;
private ImageView ivPhoto;
//动态权限
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
List<String> mPermissionList = new ArrayList<>();
private final int mRequestCode = 100;//权限请求码
//TakePhoto
private TakePhoto takePhoto;
// private CropOptions cropOptions; //裁剪参数
private CompressConfig compressConfig; //压缩参数
private Uri imageUri; //图片保存路径
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 23) { //6.0才用动态权限
//申请相关权限
initPermission();
}
initData(); //设置压缩、裁剪参数
initView();
}
private void initData() {
// 获取TakePhoto实例
takePhoto = getTakePhoto();
//设置压缩参数
compressConfig=new CompressConfig.Builder().setMaxSize(100*1024).setMaxPixel(800).enableReserveRaw(true).create();
takePhoto.onEnableCompress(compressConfig,true); //设置为需要压缩显示进度条
//设置拍照参数
TakePhotoOptions.Builder builder = new TakePhotoOptions.Builder();
builder.setWithOwnGallery(true);//takephoto自带相册
builder.setCorrectImage(true);//纠正拍照旋转角度
takePhoto.setTakePhotoOptions(builder.create());
}
private CropOptions getCropOptions() {
//设置裁剪参数
CropOptions.Builder builder = new CropOptions.Builder();
builder.setOutputX(800);
builder.setOutputY(800);
builder.setWithOwnCrop(true);//自带剪切工具
return builder.create();
}
private void initPermission() {
mPermissionList.clear(); //清空没有通过的权限
//逐个判断你要的权限是否已经通过
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);//添加还未授予的权限
}
}
//申请权限
if (mPermissionList.size() > 0) {//有权限没有通过,需要申请
ActivityCompat.requestPermissions(this, permissions, mRequestCode);
} else {
//说明权限都已经通过,可以做你想做的事情去
}
}
private void initView() {
btnPhoto = findViewById(R.id.btnPhoto1);
btnPhotos = findViewById(R.id.btnPhoto2);
btnUpdate = findViewById(R.id.btnUpdate);
ivPhoto = findViewById(R.id.ivPhoto);
btnPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("1111111", "btnPhoto");
imageUri = getImageCropUri();
//拍照并裁剪,有BUG不能用
//takePhoto.onPickFromCaptureWithCrop(imageUri, getCropOptions());
//仅仅拍照不裁剪
takePhoto.onPickFromCapture(imageUri);
}
});
btnPhotos.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("1111111", "btnPhotos");
// onClickk(getTakePhoto());
imageUri = getImageCropUri();
// //从相册中选取图片并裁剪
takePhoto.onPickFromGalleryWithCrop(imageUri, getCropOptions());
// //从相册中选取不裁剪
//takePhoto.onPickFromGallery();
}
});
}
private void configCompress(TakePhoto takePhoto) { //压缩配置
int maxSize = Integer.parseInt("409600");//最大 压缩
int width = Integer.parseInt("800");//宽
int height = Integer.parseInt("800");//高
CompressConfig config;
config = new CompressConfig.Builder().setMaxSize(maxSize)
.setMaxPixel(width >= height ? width : height)
.enableReserveRaw(false)//拍照压缩后是否显示原图
.create();
takePhoto.onEnableCompress(config, false);//是否显示进度条
}
@Override
public void takeSuccess(TResult result) {
super.takeSuccess(result);
Log.i("1111111", "takeSuccess : " + result.getImage().getOriginalPath());
super.takeSuccess(result);
String iconPath = result.getImage().getOriginalPath();
//Toast显示图片路径
Log.i("1111111","imagePath:" + iconPath);
Toast.makeText(this, "imagePath:" + iconPath, Toast.LENGTH_SHORT).show();
//Google Glide库 用于加载图片资源
Glide.with(this).load(iconPath).into(ivPhoto);
}
@Override
public void takeFail(TResult result, String msg) {
super.takeFail(result, msg);
Log.i("1111111", "takeFail : " + msg);
}
@Override
public void takeCancel() {
super.takeCancel();
Log.i("1111111", "takeCancel : " );
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean hasPermissionDismiss = false;//有权限没有通过
if (mRequestCode == requestCode) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1) {
hasPermissionDismiss = true;
}
}
//如果有权限没有被允许
if (hasPermissionDismiss) {
// showPermissionDialog();//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问
} else {
//全部权限通过,可以进行下一步操作。。。
}
}
}
//获得照片的输出保存Uri
private Uri getImageCropUri() {
ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File file = new File(directory, System.currentTimeMillis() + ".jpg");
// File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
return Uri.fromFile(file);
}
}