做项目时遇到客户一个另类需求——“拍照必须使用系统相机”,当手机装有第三方相机时,
调用new Intent(MediaStore.ACTION_IMAGE_CAPTURE);会弹出相机选择界面,
但是客户是不允许用户用第三方相机的,因为第三方相机有的可以直接进行选择照片操作,
但是客户要求照片必须是当前拍摄的。
上面是遇到的问题,寻找解决方案,发现Intent可以通过setPackage设置包名来指定
要打开的应用,安卓原生系统中照相机的包名是com.android.camera,通过测试在三
星等几个使用原生系统的手机中可以避免选择第三方相机直接调用了系统相机,但是在
魅族、小米等手机中仍然弹出相机选择界面,通过查看这几款手机自带相机的apk发现,
它们的包名并不是com.android.camera,试着将包名改为魅族小米的包名测试通过,
可以直接指定系统相机;
虽然找到了原因,但是我们总不能每款手机都做一个适配来指定包名吧。还好安卓
允许我们获取手机中安装的所有apk的信息。我的解决方案是遍历手机中所有安装的软件,
判断软件的名称为"相机,照相机,照相,拍照,摄像,Camera,camera"等关键字,
系统相机无非都是这样命名的。以下是代码:
/**
* 照相功能
* imgPath指定照片存储路径
*/
public void cameraMethod(Activity activity, int RESULT_CAPTURE_IMAGE,
String imgPath) {
try {
Intent imageCaptureIntent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
File out = new File(imgPath);
Uri uri = Uri.fromFile(out);
try {// 尽可能调用系统相机
String cameraPackageName = getCameraPhoneAppInfos(myActivity);
if (cameraPackageName == null) {
cameraPackageName = "com.android.camera";
}
final Intent intent_camera = activity.getPackageManager()
.getLaunchIntentForPackage(cameraPackageName);
if (intent_camera != null) {
imageCaptureIntent.setPackage(cameraPackageName);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
activity.startActivityForResult(imageCaptureIntent,
RESULT_CAPTURE_IMAGE);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 对使用系统拍照的处理
public String getCameraPhoneAppInfos(Activity context) {
try {
String strCamera = "";
List<PackageInfo> packages = context.getPackageManager()
.getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
try {
PackageInfo packageInfo = packages.get(i);
String strLabel = packageInfo.applicationInfo.loadLabel(
context.getPackageManager()).toString();
// 一般手机系统中拍照软件的名字
if ("相机,照相机,照相,拍照,摄像,Camera,camera".contains(strLabel)) {
strCamera = packageInfo.packageName;
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (strCamera != null) {
return strCamera;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}