在學郭霖大神的第一行代碼的時候,學到利用相機拍照和從本地相冊取照片的那一小節的時候,代碼寫出來但是出了很多問題,APP老是崩潰,一番百度最終還是沒有找到解決辦法
無奈只能用別人現成的輪子了,然后就發現了這個TakePhoto框架,很多人都推薦用這個,所以寫下這個博客來記錄一下這個框架的基本使用
TakePhoto是一個很優秀的關於圖片的一些處理的第三方框架
GitHub地址如下:https://github.com/crazycodeboy/TakePhoto
配置的辦法很簡單,在工程目錄的APP目錄下的build.gradle里面的dependencies標簽加入依賴即可

compile 'com.jph.takephoto:takephoto_library:4.0.3'
官方的最新版本是4.1.0,但我這邊加入4.1.0的依賴會報錯,然后我試了一下4.0.3的是可以的,所以就直接用4.0.3了
大致實現過程就是實現TakePhoto.TakeResultListener, InvokeListener接口
然后重寫幾個方法就行,方法體里面的內容根據自己的項目需要進行編寫
package com.example.car; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import com.jph.takephoto.app.TakePhoto; import com.jph.takephoto.app.TakePhotoImpl; import com.jph.takephoto.compress.CompressConfig; import com.jph.takephoto.model.CropOptions; import com.jph.takephoto.model.InvokeParam; import com.jph.takephoto.model.TContextWrap; import com.jph.takephoto.model.TResult; import com.jph.takephoto.permission.InvokeListener; import com.jph.takephoto.permission.PermissionManager; import com.jph.takephoto.permission.TakePhotoInvocationHandler; import java.io.File; //實現TakePhoto.TakeResultListener, InvokeListener接口 public class Setting extends AppCompatActivity implements TakePhoto.TakeResultListener, InvokeListener { TakePhoto takePhoto; InvokeParam invokeParam; String imagePath; File file; Uri uri; int size; CropOptions cropOptions; ImageView headSculpture; Bitmap bitmap; File test; SharedPreferences sharedPreferences; SharedPreferences.Editor editor; @Override protected void onCreate(Bundle savedInstanceState) { getTakePhoto().onCreate(savedInstanceState); super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting); initEvents(); addListener(); } public void initEvents(){ //各控件初始化 file = new File(getExternalCacheDir(), System.currentTimeMillis() + ".png"); uri = Uri.fromFile(file); size = Math.min(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels); cropOptions = new CropOptions.Builder().setOutputX(size).setOutputX(size).setWithOwnCrop(false).create(); headSculpture = (ImageView)findViewById(R.id.head_sculpture); sharedPreferences = getSharedPreferences("Setting",MODE_MULTI_PROCESS); imagePath = sharedPreferences.getString("image_path",""); Log.d("Image_path的值是",imagePath+"....."); if(!imagePath.equals("")){ headSculpture.setImageBitmap(BitmapFactory.decodeFile(imagePath)); } } public void addListener(){ headSculpture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //彈出框框 AlertDialog.Builder builder = new AlertDialog.Builder(Setting.this,android.R.style.Theme_Holo_Light_Dialog); builder.setIcon(R.drawable.ic_choice_pic); builder.setTitle("選擇"); String[] choices = {"拍照","從相機里選擇"}; builder.setItems(choices, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which){ case 0: //拍照並裁剪 takePhoto.onPickFromCaptureWithCrop(uri, cropOptions); break; case 1: //從照片選擇並裁剪 takePhoto.onPickFromGalleryWithCrop(uri, cropOptions); break; default: break; } } }); builder.show(); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { getTakePhoto().onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); } @Override protected void onSaveInstanceState(Bundle outState) { getTakePhoto().onSaveInstanceState(outState); super.onSaveInstanceState(outState); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //以下代碼為處理Android6.0、7.0動態權限所需 PermissionManager.TPermissionType type = PermissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionManager.handlePermissionsResult(this, type, invokeParam, this); } @Override public PermissionManager.TPermissionType invoke(InvokeParam invokeParam) { PermissionManager.TPermissionType type = PermissionManager.checkPermission(TContextWrap.of(this), invokeParam.getMethod()); if (PermissionManager.TPermissionType.WAIT.equals(type)) { this.invokeParam = invokeParam; } return type; } public TakePhoto getTakePhoto() { //獲得TakePhoto實例 if (takePhoto == null) { takePhoto = (TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(this, this)); } //設置壓縮規則,最大500kb takePhoto.onEnableCompress(new CompressConfig.Builder().setMaxSize(500 * 1024).create(), true); return takePhoto; } @Override public void takeSuccess(final TResult result) { //成功取得照片 test = new File(result.getImage().getOriginalPath()); editor = sharedPreferences.edit(); editor.putString("image_path",result.getImage().getOriginalPath()); editor.commit(); if(test.exists()){ bitmap = BitmapFactory.decodeFile(result.getImage().getOriginalPath()); headSculpture.setImageBitmap(bitmap); } } @Override public void takeFail(TResult result, String msg) { //取得失敗 Toast.makeText(Setting.this,"設置失敗",Toast.LENGTH_SHORT).show(); } @Override public void takeCancel() { //取消 } }
取出照片還有一些其他操作可能需要看一下里面TResult和TImage這兩個類
效果如下

