今天来整理一下android和h5交互实现拍照,相册选图片进行显示,适配了7.0。6.0的网络权限顺便也简单说下。
PackageManager pkgManager = getPackageManager();
// 读写 sd card 权限非常重要, android6.0默认禁止的, 建议初始化之前就弹窗让用户赋予该权限
boolean sdCardWritePermission =
pkgManager.checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, getPackageName()) == PackageManager.PERMISSION_GRANTED;
// read phone state用于获取 imei 设备信息
boolean phoneSatePermission =
pkgManager.checkPermission(Manifest.permission.READ_PHONE_STATE, getPackageName()) == PackageManager.PERMISSION_GRANTED;
boolean cameraPermission =
pkgManager.checkPermission(Manifest.permission.CAMERA, getPackageName()) == PackageManager.PERMISSION_GRANTED;
if (Build.VERSION.SDK_INT >= 23 && !sdCardWritePermission || !phoneSatePermission || !cameraPermission) {
//没有权限,去申请
requestPermission();
} else {
//有权限了
}
通过上面的代码,我们可以看到,我写的简单的申请权限,写的不太好,你们可以去找些比较好的来使用,我们这里主要讲的还是与H5交互拍照,申请权限的话就是下面的代码:
private void requestPermission() {
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE,Manifest.permission.CAMERA},
REQUEST_PERMISSION);
}
权限申请好了就是申请权限的回调了:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_PERMISSION) {
if ((grantResults.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED)) {
//这是我推送的代码
PushManager.getInstance().initialize(this.getApplicationContext(), userPushService);
} else {
Logs.e("tag2", "We highly recommend that you need to grant the special permissions before initializing the SDK, otherwise some "
+ "functions will not work");
PushManager.getInstance().initialize(this.getApplicationContext(), userPushService);
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
好了,简单的权限就申请好了,下面就是主要的交互了,(一定要在有读写权限拍照权限的基础上来写):
首先我们和H5商量一个方法来调用:
因为我的项目和H5交互比较多,所以我就将所有的交互写在了一个类中调用。
private Activity act = null;
//调用 照相机
@JavascriptInterface
public void imagePickerWithID(String json) {
((MainActivity) act).imagePickerWithID(json);
}
然后在我们需要调用的类中调用一下
private String photoCallback =null;
//调用照相机传照片
public void imagePickerWithID(final String json) {
mHandlerHelper.sendMessage(json, new MPCallBack() {
@Override
public void callBack(int what, Object obj) {
showActionSheet();
photoCallback = json;
}
});
}
然后我们将拍照后或者去相册选了图片后通过callBack来回调给H5去显示一下:
这里需要注意的是,不要按照我的样式写,因为,我封装了代码,你们写的话,就正常和H5进行交互,回传给H5数据就行。核心代码在下面
上面的方法中的showActionSheet就是去调用客户端的相机或者相册了,接下来就是实际代码:
//拍照START
public static final int PHOTOZOOM = 0; // 相册/拍照
public static final int PHOTOTAKE = 1; // 相册/拍照
private String photoSavePath =Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/ClipHeadPhoto/cache/";// 保存路径
private Stri

本文详细介绍了在Android应用中如何实现与H5交互进行拍照和从相册选择图片,并适配了Android 7.0及6.0的网络权限。文章包括权限申请、回调处理、与H5交互的接口定义、实际调用相机或相册的代码,以及针对7.0以上版本创建文件夹的权限配置。核心代码展示了如何保存图片并回调给H5进行显示。
最低0.47元/天 解锁文章
2158

被折叠的 条评论
为什么被折叠?



