RxCamera 模块入门:Android 相机开发的极简集成流程

集成 RxCamera 到 Android 项目

在项目的 build.gradle 文件中添加依赖:

implementation 'com.github.pengrad:rxcamrea:1.0.0'

确保已启用 Java 8 支持:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

初始化相机实例

通过 RxCamera.open() 创建相机实例,需传入 Context 和相机方向(前置/后置):

RxCamera rxCamera = RxCamera.open(context, CameraCharacteristics.LENS_FACING_BACK);

检查设备兼容性:

if (!RxCamera.isAvailable(context)) {
    // 处理不支持相机的情况
}

配置预览界面

将预览画面绑定到 TextureViewSurfaceView

rxCamera.bind(textureView)
    .subscribe(
        success -> { /* 预览启动成功 */ },
        error -> { /* 处理错误 */ }
    );

支持动态调整预览尺寸:

rxCamera.setPreviewSize(1280, 720);

捕获图像

调用 takePicture() 获取照片数据:

rxCamera.takePicture()
    .subscribe(
        bitmap -> { /* 处理返回的Bitmap */ },
        throwable -> { /* 捕获失败处理 */ }
    );

支持保存到文件:

rxCamera.takePicture(new File("/sdcard/photo.jpg"))
    .subscribe(...);

释放资源

ActivityFragment 生命周期结束时释放相机:

@Override
protected void onDestroy() {
    rxCamera.release();
    super.onDestroy();
}

高级功能扩展

  • 连续拍摄:通过 interval() 操作符实现定时拍摄
  • 实时滤镜:结合 map() 操作符处理预览帧数据
  • 焦点控制:调用 autoFocus() 方法实现触摸对焦

常见问题解决

  • 权限问题:确保已声明 CAMERAWRITE_EXTERNAL_STORAGE 权限
  • 方向适配:使用 setDisplayOrientation() 调整预览旋转角度
  • 预览拉伸:根据设备支持的分辨率比例匹配视图宽高

通过以上步骤可快速实现基础相机功能,RxCamera 的响应式设计能显著简化异步操作和生命周期管理代码。

<PreferenceGroup xmlns:camera="http://schemas.android.com/apk/res/com.mediatek.camera0" camera:title="@string/pref_camera_settings_category"> <IconListPreference camera:key="pref_camera_flashmode_key" camera:defaultValue="@string/pref_camera_flashmode_default" camera:title="@string/pref_camera_flashmode_title" camera:icons="@array/camera_flashmode_icons" camera:entries="@array/pref_camera_flashmode_entries" camera:entryValues="@array/pref_camera_flashmode_entryvalues" /> <IconListPreference camera:key="pref_camera_exposure_key" camera:defaultValue="@string/pref_camera_exposure_default" camera:title="@string/pref_exposure_title" camera:icons="@array/camera_exposure_icons" camera:entries="@array/pref_camera_exposure_entries" camera:entryValues="@array/pref_camera_exposure_entryvalues" /> <IconListPreference camera:key="pref_camera_scenemode_key" camera:defaultValue="@string/pref_camera_scenemode_default" camera:title="@string/pref_camera_scenemode_title" camera:icons="@array/camera_scenemode_icons" camera:entries="@array/pref_camera_scenemode_entries" camera:entryValues="@array/pref_camera_scenemode_entryvalues" /> <IconListPreference camera:key="pref_camera_whitebalance_key" camera:defaultValue="@string/pref_camera_whitebalance_default" camera:title="@string/pref_camera_whitebalance_title" camera:icons="@array/whitebalance_icons" camera:entries="@array/pref_camera_whitebalance_entries" camera:entryValues="@array/pref_camera_whitebalance_entryvalues" /> <RecordLocationPreference camera:key="pref_camera_recordlocation_key" camera:defaultValue="@string/pref_camera_recordlocation_default" camera:title="@string/pref_camera_record_location_title" camera:entries="@array/pref_camera_recordlocation_entries" camera:entryValues="@array/pref_camera_recordlocation_entryvalues" /> <!-- camera:icons="@array/camera_recordlocation_icons" --> <!-- add by yanglh start --> <ListPreference camera:key="pref_camera_picturesize_key_htf" camera:defaultValue="@string/pref_camera_iso_default" camera:entries="@array/pref_camera_htfsize_entries" camera:entryValues="@array/pref_camera_htfsize_entryvalues" camera:title="@string/pref_camera_picturesize_title" /> <!-- add by yanglh end --> <ListPreference camera:key="pref_camera_picturesize_key" camera:title="@string/pref_camera_picturesize_title"/> <IconListPreference camera:key="pref_camera_id_key" camera:defaultValue="@string/pref_camera_id_default" camera:title="@string/pref_camera_id_title" camera:icons="@array/camera_id_icons" camera:entries="@array/camera_id_entries" /> <!-- ISO --> <ListPreference camera:key="pref_camera_iso_key" camera:defaultValue="@string/pref_camera_iso_default" camera:title="@string/pref_camera_iso_title" camera:entries="@array/pref_camera_iso_entries" camera:entryValues="@array/pref_camera_iso_entryvalues"/> <IconListPreference camera:key="perf_camera_ais_key" camera:defaultValue="@string/pref_camera_ais_default" camera:title="@string/pref_camera_ais_title" camera:entries="@array/pref_camera_ais_entries" camera:entryValues="@array/pref_camera_ais_entryvalues"/> <!-- Image adjustment --> <!-- Edge --> <ListPreference camera:key="pref_camera_edge_key" camera:defaultValue="@string/pref_camera_edge_default" camera:title="@string/pref_camera_edge_title" camera:entries="@array/pref_camera_dip_entries" camera:entryValues="@array/pref_camera_dip_entryvalues" /> <!-- Hue --> <ListPreference camera:key="pref_camera_hue_key" camera:defaultValue="@string/pref_camera_hue_default" camera:title="@string/pref_camera_hue_title" camera:entries="@array/pref_camera_dip_entries" camera:entryValues="@array/pref_camera_dip_entryvalues" /> <!-- Saturation --> <ListPreference camera:key="pref_camera_saturation_key" camera:defaultValue="@string/pref_camera_saturation_default" camera:title="@string/pref_camera_saturation_title" camera:entries="@array/pref_camera_dip_entries" camera:entryValues="@array/pref_camera_dip_entryvalues" /> <!-- Brightness --> <ListPreference camera:key="pref_camera_brightness_key" camera:defaultValue="@string/pref_camera_brightness_default" camera:title="@string/pref_camera_brightness_title" camera:entries="@array/pref_camera_dip_entries" camera:entryValues="@array/pref_camera_dip_entryvalues" /> <!-- Contrast --> <ListPreference camera:key="pref_camera_contrast_key" camera:defaultValue="@string/pref_camera_contrast_default" camera:title="@string/pref_camera_contrast_title" camera:entries="@array/pref_camera_dip_entries" camera:entryValues="@array/pref_camera_dip_entryvalues" /> <!-- Effects --> <IconListPreference camera:key="pref_camera_coloreffect_key" camera:defaultValue="@string/pref_camera_coloreffect_default" camera:title="@string/pref_camera_coloreffect_title" camera:icons="@array/camera_coloreffect_icons" camera:entries="@array/pref_camera_coloreffect_entries" camera:entryValues="@array/pref_camera_coloreffect_entryvalues" /> <!-- Self timer setting --> <IconListPreference camera:key="pref_camera_self_timer_key" camera:defaultValue="@string/pref_camera_selftimer_default" camera:title="@string/pref_camera_selftimer_title" camera:icons="@array/camera_selftimer_icons" camera:entries="@array/pref_camera_selftimer_entries" camera:entryValues="@array/pref_camera_selftimer_entryvalues"/> <!-- anti-flicker --> <ListPreference camera:key="pref_camera_antibanding_key" camera:defaultValue="@array/pref_camera_antibanding_default_array" camera:title="@string/pref_camera_antibanding_title" camera:entries="@array/pref_camera_antibanding_entries" camera:entryValues="@array/pref_camera_antibanding_entryvalues" /> <ListPreference camera:key="pref_camera_zsd_key" camera:defaultValue="@string/pref_camera_zsd_default" camera:title="@string/pref_camera_zsd_title" camera:entries="@array/pref_camera_zsd_entries" camera:entryValues="@array/pref_camera_zsd_entryvalues" /> <ListPreference camera:key="pref_camera_shot_number" camera:defaultValue="@string/pref_camera_continuous_number_default" camera:title="@string/pref_camera_continuous_number_title" camera:entries="@array/pref_camera_continuous_number_entries" camera:entryValues="@array/pref_camera_continuous_number_entryvalues" /> <ListPreference camera:key="pref_camera_Volume_shortcut_keys" camera:defaultValue="@string/pref_camera_Volume_shortcut_key_default" camera:title="@string/pref_camera_Volume_shortcut_key_title" camera:entries="@array/pref_camera_Volume_shortcut_key_entries" camera:entryValues="@array/pref_camera_Volume_shortcut_key_entryvalues" /> <!-- video setting start --> <IconListPreference camera:key="pref_video_quality_key" camera:title="@string/pref_video_quality_title" camera:entries="@array/pref_video_quality_entries" camera:entryValues="@array/pref_video_quality_entryvalues"/> <IconListPreference camera:key="pref_slow_motion_video_quality_key" camera:title="@string/pref_slow_motion_video_quality_title" camera:entries="@array/pref_slow_motion_video_quality_entries" camera:entryValues="@array/pref_slow_motion_video_quality_entryvalues"/> <IconListPreference camera:key="pref_refocus_video_quality_key" camera:title="@string/pref_refocus_video_quality_title" camera:entries="@array/pref_refocus_video_quality_entries" camera:entryValues="@array/pref_refocus_video_quality_entryvalues"/> <ListPreference camera:key="pref_camera_recordaudio_key" camera:defaultValue="@string/pref_camera_recordaudio_default" camera:title="@string/pref_camera_recordaudio_title" camera:entries="@array/pref_camera_recordaudio_entries" camera:entryValues="@array/pref_camera_recordaudio_entryvalues"/> <ListPreference camera:key="pref_camera_video_hd_recording_key" camera:defaultValue="@string/pref_video_hd_recording_default" camera:title="@string/pref_camera_video_hd_recording_title" camera:entries="@array/pref_camera_video_hd_recording_entries" camera:entryValues="@array/pref_camera_video_hd_recording_entryvalues" /> <!-- video setting end --> <ListPreference camera:key="pref_camera_image_properties_key" camera:defaultValue="@string/pref_camera_image_properties_default" camera:title="@string/pref_camera_image_properties_title" camera:entries="@array/pref_camera_image_properties_entries" camera:entryValues="@array/pref_camera_image_properties_entryvalues" /> <ListPreference camera:defaultValue="@string/pref_dual_camera_default" camera:entries="@array/pref_dual_camera_entries" camera:entryValues="@array/pref_dual_camera_entryvalues" camera:key="pref_dual_camera_key" camera:title="@string/pref_dual_camera_switch" /> <ListPreference camera:defaultValue="@string/pref_fast_af_default" camera:entries="@array/pref_dual_camera_dip_entries" camera:entryValues="@array/pref_dual_camera_dip_entryvalues" camera:key="pref_fast_af_key" camera:title="@string/pref_fast_af_title" /> <ListPreference camera:defaultValue="@string/pref_distance_default" camera:entries="@array/pref_dual_camera_dip_entries" camera:entryValues="@array/pref_dual_camera_dip_entryvalues" camera:key="pref_distance_key" camera:title="@string/pref_distance_info_title" /> <IconListPreference camera:key="pref_camera_picturesize_ratio_key" camera:title="@string/pref_camera_picturesize_ratio_title" camera:entries="@array/pref_camera_picturesize_ratio_entries" camera:entryValues="@array/pref_camera_picturesize_ratio_entryvalues" camera:icons="@array/pref_htf_preview_icons"/> <IconListPreference camera:key="pref_voice_key" camera:defaultValue="@string/pref_voice_default" camera:title="@string/pref_voice_capture" camera:entries="@array/pref_voice_entries" camera:entryValues="@array/pref_voice_entryvalues" /> <IconListPreference camera:key="pref_slow_motion_key" camera:defaultValue="@string/pref_slow_motion_default" camera:title="@string/pref_slow_motion_title" camera:icons="@array/slow_motion_icons" camera:entries="@array/pref_slow_motion_entries" camera:entryValues="@array/pref_slow_motion_entryvalues" /> <ListPreference camera:key="pref_camera_facebeauty_properties_key" camera:defaultValue="@string/pref_camera_facebeauty_properties_default" camera:title="@string/pref_camera_facebeauty_properties_title" camera:entries="@array/pref_camera_facebeauty_properties_entries" camera:entryValues="@array/pref_camera_facebeauty_properties_entryvalues" /> <!-- facebeauty adjustment --> <!-- Smooth --> <IconListPreference camera:key="pref_facebeauty_smooth_key" camera:defaultValue="@string/pref_facebeauty_smooth_default" camera:title="@string/pref_facebeauty_smooth_title" camera:icons="@array/facebeauty_smooth_icons" camera:entries="@array/pref_camera_dip_entries" camera:entryValues="@array/pref_camera_facebeauty_turning_entryvalues" /> <!-- Skin color --> <IconListPreference camera:key="pref_facebeauty_skin_color_key" camera:defaultValue="@string/pref_facebeauty_skin_color_default" camera:title="@string/pref_facebeauty_skin_color_title" camera:icons="@array/facebeauty_skin_color_icons" camera:entries="@array/pref_camera_dip_entries" camera:entryValues="@array/pref_camera_facebeauty_turning_entryvalues" /> <!-- Sharp --> <IconListPreference camera:key="pref_facebeauty_sharp_key" camera:defaultValue="@string/pref_facebeauty_sharp_default" camera:title="@string/pref_facebeauty_sharp_title" camera:icons="@array/facebeauty_sharp_icons" camera:entries="@array/pref_camera_dip_entries" camera:entryValues="@array/pref_camera_facebeauty_turning_entryvalues" /> <ListPreference camera:key="pref_video_eis_key" camera:defaultValue="@string/pref_camera_eis_default" camera:title="@string/pref_camera_eis_title" camera:entries="@array/pref_camera_eis_entries" camera:entryValues="@array/pref_camera_eis_entryvalues"/> <ListPreference camera:key="pref_video_3dnr_key" camera:defaultValue="@string/pref_camera_3dnr_default" camera:title="@string/pref_camera_3dnr_title" camera:entries="@array/pref_camera_3dnr_entries" camera:entryValues="@array/pref_camera_3dnr_entryvalues"/> <ListPreference camera:key="pref_face_detect_key" camera:defaultValue="@string/pref_camera_face_detect_default" camera:title="@string/pref_camera_face_detect_title" camera:entries="@array/pref_camera_face_detect_entries" camera:entryValues="@array/pref_camera_face_detect_entryvalues"/> <ListPreference camera:key="pref_face_beauty_multi_mode_key" camera:title="@string/pref_face_beauty_mode_title" camera:entries="@array/pref_camera_multi_face_beauty_entries" camera:entryValues="@array/pref_camera_multi_face_beauty_entryvalues"/> <ListPreference camera:key="pref_af_mode_key" camera:defaultValue="@string/pref_af_mode_default" camera:title="@string/pref_af_mode_title" camera:entries="@array/pref_af_entries" camera:entryValues="@array/pref_af_entryvalues"/> <IconListPreference camera:key="pref_hdr_key" camera:defaultValue="@string/pref_camera_hdr_default" camera:title="@string/pref_camera_hdr_title" camera:icons="@array/pref_hdr_icons" camera:entries="@array/pref_camera_hdr_entries" camera:entryValues="@array/pref_camera_hdr_entryvalues"/> <ListPreference camera:key="pref_asd_key" camera:defaultValue="@string/pref_asd_default" camera:title="@string/pref_asd_title" camera:entries="@array/pref_asd_entries" camera:entryValues="@array/pref_asd_entryvalues"/> <IconListPreference camera:key="pref_dng_key" camera:defaultValue="@string/pref_dng_default" camera:title="@string/pref_dng_title" camera:icons="@array/dng_icons" camera:entries="@array/pref_dng_entries" camera:entryValues="@array/pref_dng_entryvalues"/> <!--add by yanglh start --> <IconListPreference camera:key="pref_htf_settings_key" camera:defaultValue="@string/pref_camera_hdr_default" camera:title="@string/pref_camera_settings_category" camera:icons="@array/pref_htf_settings_icons" camera:entries="@array/pref_htf_settings_entries" camera:entryValues="@array/pref_htf_settings_entryvalues"/> <!-- <IconListPreference camera:key="pref_camera_picturesize_htficon_key" camera:title="@string/pref_camera_picturesize_ratio_title" camera:entries="@array/pref_camera_picturesize_htf_entries" camera:entryValues="@array/pref_camera_picturesize_htf_entryvalues" camera:defaultValue="@string/pref_camera_hdr_default" camera:icons="@array/pref_htf_preview_icons"/> --> <IconListPreference camera:key="pref_htf_color_key" camera:defaultValue="@string/pref_camera_hdr_default" camera:title="@string/pref_camera_settings_category" camera:icons="@array/pref_htf_color_icons" camera:entries="@array/pref_htf_color_entries" camera:entryValues="@array/pref_htf_color_entryvalues"/> <!--add by yanglh end--> </PreferenceGroup>
11-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值