TakePhoto實現拍照得到圖片和從相冊得到圖片


在學郭霖大神的第一行代碼的時候,學到利用相機拍照和從本地相冊取照片的那一小節的時候,代碼寫出來但是出了很多問題,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這兩個類

效果如下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM