调用相机获取图片在app中使用频率还是蛮高的,避免重复造轮子,我就整理成了一个工具类,下次再想实现这个功能只需把此类复制过去即可。
请注意看使用说明。
package com.sinogeo.util;
import java.io.File;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
/**
* @author 作者 :WY
* @version 创建时间:2017年8月21日 上午11:03:38 类说明:头像工具类,提供接口返回创建完成的图片的路径
*
* 注意: 加权限: <uses-permission
* android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* <uses-permission android:name="android.permission.CAMERA"/>
*
* 须在调用的activity内的onActivityResult下调用HeadIconUtils.onActivityResult(int
* requestCode, int resultCode, Intent data)方法
*
* 在fragment内调用构造类时请填入myfragment.this,而不是getactivity();
*
* 此工具类允许用户传入图片保存的路径,未传入则在手机根目录创建一个以软件包名为名称的文件夹,文件夹内再创建一个temp文件夹,
* 图片都会保存在里面
*/
public class HeadIconUtils {
/** 拍照 */
public final static int camera = 777;
/** 相册 */
public final static int picture = 888;
/** 裁剪 */
private final static int tailor = 999;
private Toast mToast;
private Context mContext;
private String imagePath;
private HeadIconFace backFace;
private String imageName;
/** 当前功能类型 */
private int type;
private Fragment fragment;
/** 返回创建完成的图片的路径的回调接口 */
public interface HeadIconFace {
void succ(Intent intent);
}
/**
*
* @param context
* @param backFace
* 回调接口,完成时返回图片完整路径
* @param type
* 意图,拍照camera,相册picture
*/
public HeadIconUtils(Context context, HeadIconFace backFace, int type) {
mContext = context;
this.backFace = backFace;
this.type = type;
initData(type);
}
/** 如果是在fragment内调用请使用此构造器 */
public HeadIconUtils(Fragment fragment, HeadIconFace backFace, int type) {
mContext = fragment.getActivity();
this.fragment = fragment;
this.backFace = backFace;
this.type = type;
initData(type);
}
/** 此构造器允许传入图片路径 */
public HeadIconUtils(Context context, HeadIconFace backFace, String path, int type) {
mContext = context;
imagePath = path;
this.backFace = backFace;
this.type = type;
initData(type);
}
private void initData(int type) {
if (type == camera) {// 拍照
try {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有储存卡
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
imageName = headIconName();
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getTempPath() + imageName)));
if (fragment == null) {
((Activity) mContext).startActivityForResult(intent, camera);
} else {
this.fragment.startActivityForResult(intent, camera);
}
} else {
showMessage("请确认已经插入SD卡");
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (type == picture) {// 相册
try {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
if (fragment == null) {
((Activity) mContext).startActivityForResult(intent, picture);
} else {
this.fragment.startActivityForResult(intent, picture);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case camera:
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(Uri.fromFile(new File(getTempPath() + imageName)), "image/*");
intent.putExtra("crop", "true");
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("scale", true);
imageName = headIconName();
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getTempPath() + imageName)));
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
intent.putExtra("noFaceDetection", true);
if (fragment == null) {
((Activity) mContext).startActivityForResult(intent, tailor);
} else {
this.fragment.startActivityForResult(intent, tailor);
}
break;
case picture:
Uri uri = data.getData();
if (uri != null) {
Intent i = new Intent("com.android.camera.action.CROP");
i.setDataAndType(uri, "image/*");
i.putExtra("crop", "true");
i.putExtra("outputX", 300);
i.putExtra("outputY", 300);
i.putExtra("scale", true);
imageName = headIconName();
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getTempPath() + imageName)));
i.putExtra("return-data", false);
i.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
i.putExtra("noFaceDetection", true);
if (fragment == null) {
((Activity) mContext).startActivityForResult(i, tailor);
} else {
this.fragment.startActivityForResult(i, tailor);
}
}
break;
case tailor:
Intent intent2 = new Intent();
intent2.setAction(type + "");
backFace.succ(intent2.putExtra("path", getTempPath() + imageName));
break;
}
}
private String headIconName() {
return System.currentTimeMillis() + ".png";
}
private String getTempPath() {
if (!TextUtils.isEmpty(imagePath)) {
return imagePath;
}
String projectPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + getAppPackageName(mContext)
+ File.separator;
File f = new File(projectPath);
if (!f.exists()) {
f.mkdir();
}
String tempPath = projectPath + "temp" + File.separator;
f = new File(tempPath);
if (!f.exists()) {
f.mkdir();
}
return tempPath;
}
/**
* 返回当前程序包名
*/
private String getAppPackageName(Context context) {
String packageName = "";
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
packageName = pi.packageName;
} catch (Exception e) {
Log.e("CheckUpdateSyncTask", "Exception", e);
}
return packageName;
}
private void showMessage(String msg) {
if (mToast == null) {
mToast = Toast.makeText(mContext, msg, Toast.LENGTH_SHORT);
} else {
mToast.setText(msg);
mToast.setDuration(Toast.LENGTH_SHORT);
}
mToast.show();
}
}