前言
使用uniapp开发Android app时,一些特定的需求没办法实现的时候就只能开发原生插件或者uts插件去满足需求,我的需求目前uts插件没法实现,只能靠原生插件了😆
需求:拍照不保存图片到相册,uniapp的API或者h5+都没法达到目的
实践
导入离线SDK
Android 离线SDK - 正式版 | uni小程序SDK
开发插件
CameraModule
@UniJSMethod(uiThread = true)
public void takePicture(JSONObject options, UniJSCallback callback) {
if (mUniSDKInstance.getContext() instanceof Activity) {
Activity activity = (Activity) mUniSDKInstance.getContext();
mJSCallback = callback;
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);
return;
}
Intent intent = new Intent(activity, SimpleCameraActivity.class);
activity.startActivityForResult(intent, REQUEST_SIMPLE_CAMERA);
} else {
if (callback != null) {
JSONObject result = new JSONObject();
result.put("code", -1);
result.put("message", "Failed to get activity context");
callback.invoke(result);
}
}
}
SimpleCameraActivity
private void startCamera(SurfaceHolder holder) {
try {
mCamera = Camera.open(mCameraId);
mCamera.setPreviewDisplay(holder);
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
Camera.Size optimalSize = getOptimalPreviewSize(supportedPreviewSizes,
mSurfaceView.getWidth(), mSurfaceView.getHeight());
if (optimalSize != null) {
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
Log.d(TAG, "Preview size set to: " + optimalSize.width + "x" + optimalSize.height);
}
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
} else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
mCamera.setParameters(parameters);
setCameraDisplayOrientation();
mCamera.startPreview();
mIsSafeToTakePicture = true;
} catch (Exception e) {
Log.e(TAG, "Error starting camera: " + e.getMessage());
Toast.makeText(this, "无法启动相机: " + e.getMessage(), Toast.LENGTH_SHORT).show();
setResult(RESULT_ERROR);
finish();
}
}
调试插件
跟本地打包配置一个样,之前文章有写啦就不再赘述!
最后
通过camera api 拍照不保存到相册的问题解决啦,不过缓存的问题还需要优化,采用原生插件的话就没法本地打包,很烦的一点!😑