利用安卓-takephotov410库实现拍照相册选择

利用android takephoto v4.1.0库实现拍照,相册选择

此处直接用takephoto开源的代码库,不用依赖的方式,下载地址后续上传。

一,布局如下:

<code> /<code>

二,代码如下:

<code>package com.leansmall.testphoto; 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 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 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(); //设置裁剪参数 cropOptions = new CropOptions.Builder().setAspectX(1).setAspectY(1).setWithOwnCrop(false).create(); //设置压缩参数 compressConfig = new CompressConfig.Builder().setMaxSize(50 * 1024).setMaxPixel(800).create(); takePhoto.onEnableCompress(compressConfig, true); //设置为需要压缩 } 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(); //拍照并裁剪 // takePhoto.onPickFromCaptureWithCrop(imageUri, cropOptions); //仅仅拍照不裁剪 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, cropOptions); // //从相册中选取不裁剪 takePhoto.onPickFromGallery(); } }); } //从本地选取的第二种方法,可设置多张选择 public void onClickk(TakePhoto takePhoto) { configCompress(takePhoto); takePhoto.onPickMultiple(3); //3张图片 // takePhoto.onPickFromGallery();//根据需求这里面放最大图片数 一张图片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显示图片路径 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(); } @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); } }/<code>

三、module gradle:

<code>apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.leansmall.testphoto" minSdkVersion 26 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation project(path: ':takephoto_library') implementation 'com.github.bumptech.glide:glide:3.8.0' } /<code>

四,Project gradle

<code>// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} maven { url 'https://dl.bintray.com/umsdk/release' } google() mavenCentral() jcenter{url "http://jcenter.bintray.com/"} } dependencies { classpath 'com.android.tools.build:gradle:3.5.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} maven { url 'https://dl.bintray.com/umsdk/release' } google() mavenCentral() jcenter{url "http://jcenter.bintray.com/"} } } task clean(type: Delete) { delete rootProject.buildDir } /<code>

五、takephoto gradle:

<code>apply plugin: 'com.android.library' android { compileSdkVersion 28 defaultConfig { minSdkVersion 14 targetSdkVersion 27 versionCode 45 versionName "4.1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.soundcloud.android.crop:lib_crop:1.0.0' implementation 'com.darsh.multipleimageselect:multipleimageselect:1.0.5' implementation 'me.shaohui.advancedluban:library:1.3.2' implementation 'androidx.annotation:annotation:1.1.0' } //apply from: "bintrayUpload.gradle"/<code>

六、gradle.properties

<code># Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true /<code>

七,效果图如下: