tencent cloud

腾讯云超级应用服务

动态与公告
【2025年1月2日】关于腾讯云小程序平台更名为腾讯云超级应用服务的公告
控制台更新动态
Android SDK 更新动态
iOS SDK 更新动态
Flutter 更新动态
IDE 更新动态
基础库更新动态
产品简介
产品概述
产品优势
应用场景
购买指南
计费概述
按量计费(后付费)
续费指引
停服说明
快速入门
套餐管理
概述
控制台账号管理
存储配置
加速配置
品牌化配置
平台功能
控制台登录
用户和权限体系
小程序管理
小游戏管理
应用管理
商业化
平台管理
用户管理
团队管理
运营管理
安全中心
代码接入指引
Demo 及 SDK 获取
Android
iOS
Flutter
App 服务端接入指南
GUID 生成规则
小程序开发指南
小程序介绍与开发环境
小程序代码组成
指南
框架
组件
API
服务端
JS SDK
基础库
IDE 使用指南
小游戏开发指南
指南
API
服务端
实践教程
小程序登录实践教程
小程序订阅消息实践教程
支付相关实践教程
广告接入实践教程
小游戏订阅消息实践教程
相关协议
数据处理和安全协议

定制图片选择

PDF
聚焦模式
字号
最后更新时间: 2025-07-04 17:33:28
小程序 SDK 提供默认的图片选择,默认使用 Android 系统自带的相册选择器进行选择,在小程序调用多媒体选择 wx.chooseImage、wx.chooseVideo、wx.chooseMedia时触发。
定制图片选择可以通过重写 BaseMiniAppProxyImpl 的 chooseMediaFromAlbum和chooseMediaFromCamera方法实现。
API 说明:
参数 Context:当前小程序页面的 activity 实例;
参数 options:媒体选择选项;ChooseMediaOptions
参数 listener:图片选择回调接口;ChooseMediaProxy.IChooseMediaListener
返回值 boolean:返回值为 false 表示使用默认图片选择实现,返回值为 true 表示使用定制图片选择实现。
/**
* 从相册选择媒体文件
* @param context
* @param options
* @param listener
* @return
*/
public boolean chooseMediaFromAlbum(Activity context, ChooseMediaOptions options, ChooseMediaProxy.IChooseMediaListener listener)
/**
* 从相机拍摄媒体文件
* @param context
* @param options
* @param listener
* @return
*/
public boolean chooseMediaFromCamera(Activity context, ChooseMediaOptions options, ChooseMediaProxy.IChooseMediaListener listener)
示例代码:
public static final int REQUEST_CHOOSE_MEDIA = 110;
public static final int REQUEST_CHOOSE_MEDIA_CAMERA = 111;

@Override
public void chooseMediaFromAlbum(Activity context, ChooseMediaOptions options, IChooseMediaListener listener) {
try {
TmfMiniSDK.addActivityResultListener(new IActivityResultListener() {
@Override
public boolean doOnActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CHOOSE_MEDIA && resultCode == Activity.RESULT_OK) {
ArrayList<Uri> picturePath = new ArrayList<>();
if (data == null) {
Log.e(TAG, "empty intent ,failed getting from chooseImage");
listener.onResult(false, null);
return false;
}
if (null != data.getClipData()) {
Log.d(TAG, "use clipdata as intent uri ");
ClipData clipData = data.getClipData();
for (int i = 0; i < clipData.getItemCount(); i++) {
picturePath.add(clipData.getItemAt(i).getUri());
}
Log.d(TAG, "send to mini with path " + picturePath.size());
} else if (null != data.getData()) {
Log.d(TAG, "select picture path is " + data.getData());
picturePath.add(data.getData());
}
listener.onResult(true, picturePath);
} else {
listener.onResult(false, null);
}
MiniSDK.removeActivityResultListener(this);
return true;
}
});
Intent chooserIntent = new Intent(Intent.ACTION_GET_CONTENT);
if (options.maxCount > 1) {
chooserIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
switch (options.mediaType) {
case ChooseMediaOptions.MEDIA_TYPE_IMAGE:
chooserIntent.setType("image/*");
break;
case ChooseMediaOptions.MEDIA_TYPE_VIDEO:
chooserIntent.setType("video/*");
break;
case ChooseMediaOptions.MEDIA_TYPE_MIX:
chooserIntent.setType("*/*");
chooserIntent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
default:
chooserIntent.setType("image/*");
break;
}
context.startActivityForResult(chooserIntent, REQUEST_CHOOSE_MEDIA);
} catch (Exception e) {
listener.onResult(false, null);
}
}

@Override
public void chooseMediaFromCamera(Activity context, ChooseMediaOptions options, IChooseMediaListener listener) {
Intent takePhotoIntent;
if (options.mediaType == ChooseMediaOptions.MEDIA_TYPE_VIDEO) {
takePhotoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
int duration = options.duration;
if (duration < 1 || duration > 60000) {
duration = 60000;
}
takePhotoIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, duration);
if (options.camera == ChooseMediaOptions.CAMERA_TYPE_FRONT) {
takePhotoIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);
}
} else {
takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
takePhotoIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}

if (takePhotoIntent.resolveActivity(context.getPackageManager()) == null) {
Log.e(TAG, "resolveActivity failed ,has no camera app");
listener.onResult(false, null);
return;
}

if (options.cameraOutput == null) {
Log.e(TAG, "createImageFile failed ");
listener.onResult(false, null);
return;
}

Uri imageUri = options.cameraOutput;
takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
context.startActivityForResult(takePhotoIntent, REQUEST_CHOOSE_MEDIA_CAMERA);
TmfMiniSDK.addActivityResultListener(new IActivityResultListener() {
@Override
public boolean doOnActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != REQUEST_CHOOSE_MEDIA_CAMERA) {
return false;
}
if (resultCode != Activity.RESULT_OK) {
listener.onResult(false, null);
} else {
ArrayList<Uri> picturePath = new ArrayList<>();
picturePath.add(imageUri);
listener.onResult(true, picturePath);
}
MiniSDK.removeActivityResultListener(this);
return true;
}
});
}



帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈