uniapp原生插件

发布于:2025-05-24 ⋅ 阅读:(17) ⋅ 点赞:(0)

前言

使用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 拍照不保存到相册的问题解决啦,不过缓存的问题还需要优化,采用原生插件的话就没法本地打包,很烦的一点!😑


网站公告

今日签到

点亮在社区的每一天
去签到