【问题标题】:I/HwPointEventFilter: do not support AFT because of no configI/HwPointEventFilter:不支持 AFT,因为没有配置
【发布时间】:2020-10-27 09:31:58
【问题描述】:

当我开发文本扫描应用程序时,我遇到了一个问题,即当我尝试使用已冻结在我的华为手机上的相机快速扫描/识别文本时。但它适用于其他安卓设备 为什么?

这是 logcat 消息 省略时间和项目包名

I/CameraManagerGlobal: Connecting to camera service
I/HwPointEventFilter: do not support AFT because of no config
I/SendBroadcastPermission: action:huawei.intent.action.APS_TOUCH_ACTION_DOWN, mPermissionType:0
I/SendBroadcastPermission: action:huawei.intent.action.APS_TOUCH_ACTION_UP, mPermissionType:0

清单文件

  <activity
        android:name=".CameraActivity"
        android:screenOrientation="portrait">
 </activity>

这是我的 CameraActivity.java

省略导入和包名称

public class CameraActivity extends AppCompatActivity implements View.OnClickListener {
    private CameraKitView cameraKitView;
    private ImageView btn_capture, btn_flashlight;
    private String flashMode = "";
    private AlertDialog dialog;
    private Context mContext;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        Objects.requireNonNull(getSupportActionBar()).hide();
        mContext = this;

        cameraKitView = findViewById(R.id.camera);
        btn_capture = findViewById(R.id.btn_capture);
        btn_flashlight = findViewById(R.id.btn_flashlight);
        cameraKitView.requestPermissions(this);


        flashMode = SharedHelper.getKey(this, "flashMode");

        if (flashMode.isEmpty() || flashMode.equals("off")) {
            flashMode = "off";
            flash("off");
        }

        flash(flashMode);

        btn_flashlight.setOnClickListener(this);
        btn_capture.setOnClickListener(this);


        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setCancelable(false);
        builder.setTitle(R.string.processing);
        builder.setView(R.layout.loading_dialoag);
        dialog = builder.create();


    }


    public void flash(String mode) {
        switch (mode) {
            case "off":
                cameraKitView.setFlash(CameraKit.FLASH_OFF);
                btn_flashlight.setImageDrawable(getDrawable(R.drawable.ic_flash_off_white_24dp));
                break;
            case "on":
                cameraKitView.setFlash(CameraKit.FLASH_ON);
                btn_flashlight.setImageDrawable(getDrawable(R.drawable.ic_flash_on_white_24dp));
                break;
            case "auto":
                cameraKitView.setFlash(CameraKit.FLASH_AUTO);
                btn_flashlight.setImageDrawable(getDrawable(R.drawable.ic_flash_auto_white_24dp));
                break;
        }

    }


    @Override
    protected void onStart() {
        super.onStart();
        cameraKitView.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
        cameraKitView.onResume();
    }

    @Override
    protected void onPause() {
        cameraKitView.onPause();
        super.onPause();
    }

    @Override
    protected void onStop() {
        cameraKitView.onStop();
        super.onStop();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
            Toast.makeText(this, "You must allow permission to use the camera", Toast.LENGTH_SHORT).show();
            finish();
        }

        cameraKitView.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }


    @Override
    public void onClick(View view) {
        if (view == btn_capture) {
            cameraKitView.captureImage(new CameraKitView.ImageCallback() {
                @Override
                public void onImage(CameraKitView cameraKitView, final byte[] capturedImage) {
                    // capturedImage contains the image from the CameraKitView.
                    captureSound();
                    BitmapFactory.Options opts = new BitmapFactory.Options();
                    Bitmap bitmap = BitmapFactory.decodeByteArray(capturedImage, 0, capturedImage.length, opts);
                    FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap);
                    imageProcessor(image);
                    dialog.show();
                    cameraKitView.onStop();


                }
            });

        } else if (view == btn_flashlight) {
            switch (flashMode) {
                case "off":
                    flashMode = "on";
                    flash("on");
                    SharedHelper.putKey(this, "flashMode", "on");
                    break;
                case "on":
                    flashMode = "auto";
                    flash("auto");
                    SharedHelper.putKey(this, "flashMode", "auto");
                    break;
                case "auto":
                    flashMode = "off";
                    flash("off");
                    SharedHelper.putKey(this, "flashMode", "off");
                    break;
            }


        }
    }

    public void imageProcessor(FirebaseVisionImage image) {
        FirebaseVisionDocumentTextRecognizer detector = FirebaseVision.getInstance()
                .getCloudDocumentTextRecognizer();

        detector.processImage(image)
                .addOnSuccessListener(new OnSuccessListener<FirebaseVisionDocumentText>() {
                    @Override
                    public void onSuccess(FirebaseVisionDocumentText result) {
                        dialog.dismiss();
                        Intent intent = new Intent(CameraActivity.this, TextActivity.class);
                        intent.putExtra("result", result.getText());
                        startActivity(intent);
                        overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
                        finish();

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        dialog.dismiss();
                        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
                        builder.setTitle("Processing Failed");
                        builder.setMessage(e.getLocalizedMessage());

                        builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                cameraKitView.onStart();
                                cameraKitView.onResume();
                            }
                        }).show();
                    }
                });

    }

    public void captureSound(){
        AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        switch( audio.getRingerMode() ){
            case AudioManager.RINGER_MODE_NORMAL:
                MediaActionSound sound = new MediaActionSound();
                sound.play(MediaActionSound.SHUTTER_CLICK);
                break;
            case AudioManager.RINGER_MODE_SILENT:
                break;
            case AudioManager.RINGER_MODE_VIBRATE:
                break;
        }
    }
}

【问题讨论】:

    标签: android android-camera2 google-cloud-vision huawei-mobile-services huawei-developers


    【解决方案1】:

    我尝试在华为手机上运行您提供的代码。应用第一次启动时,相机没有反应,我认为是应用没有权限访问相机。

    根据Camera Engine官网的参考文档,我认为不需要调用cameraKitView.requestPermissions(this)。删除调用该方法的那行后,应用在第一次启动后就可以正常运行,并且可以动态申请摄像头权限。


    此外,我注意到您集成了 Firebase 的 ML Kit。根据Firebase's reference documentscom.google.firebase:firebase-ml-vision:24.1.0 需要 Google Play。否则,Kit 将无法正常工作。

    由于 Google 禁令后推出的华为手机无法使用 GMS,您的手机可能不支持 Google Play。这就是为什么您的应用程序无法正常工作的原因。您可以集成HUAWEI ML Kit,它可以在所有Android设备上正常运行。 HUAWEI ML Kit支持文本识别、文档识别等功能。详情请参考Integration Documents。建议您使用HMS Toolkit,它可以帮助您快速添加HMS+GMS适配层代码,并升级您的逻辑代码以同时支持GMS和HMS。

    我对代码做了如下修改,供大家参考:修改如下:

    1. 注释掉下面这行来解决没有摄像头响应的问题。 cameraKitView.requestPermissions(this);
    2. 将配置 firebase-ml-vision 的行替换为配置 HUAWEI ML Kit 的行,以便您的应用支持文本识别。
    public class CameraActivity extends AppCompatActivity implements View.OnClickListener {
        private CameraKitView cameraKitView;
        private ImageView btn_capture, btn_flashlight;
        private String flashMode = "";
        private AlertDialog dialog;
        private Context mContext;
        
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_camera);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            Objects.requireNonNull(getSupportActionBar()).hide();
            mContext = this;
            
            cameraKitView = findViewById(R.id.camera);
            btn_capture = findViewById(R.id.btn_capture);
            btn_flashlight = findViewById(R.id.btn_flashlight);
            // cameraKitView.requestPermissions(this);
            
            
            flashMode = SharedHelper.getKey(this, "flashMode");
            
            if (flashMode.isEmpty() || flashMode.equals("off")) {
                flashMode = "off";
                flash("off");
            }
    
            flash(flashMode);
    
            btn_flashlight.setOnClickListener(this);
            btn_capture.setOnClickListener(this);
    
    
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setCancelable(false);
            builder.setTitle(R.string.processing);
            builder.setView(R.layout.loading_dialoag);
            dialog = builder.create();
            
            
        }
        
        
        public void flash(String mode) {
            switch (mode) {
                case "off":
                    cameraKitView.setFlash(CameraKit.FLASH_OFF);
                    btn_flashlight.setImageDrawable(getDrawable(R.drawable.flashlight_off));
                    break;
                case "on":
                    cameraKitView.setFlash(CameraKit.FLASH_ON);
                    btn_flashlight.setImageDrawable(getDrawable(R.drawable.flashlight_on));
                    break;
                case "auto":
                    cameraKitView.setFlash(CameraKit.FLASH_AUTO);
                    btn_flashlight.setImageDrawable(getDrawable(R.drawable.flashlight_auto));
                    break;
            }
            
        }
        
        
        @Override
        protected void onStart() {
            super.onStart();
            cameraKitView.onStart();
        }
        
        @Override
        protected void onResume() {
            super.onResume();
            cameraKitView.onResume();
        }
        
        @Override
        protected void onPause() {
            cameraKitView.onPause();
            super.onPause();
        }
        
        @Override
        protected void onStop() {
            cameraKitView.onStop();
            super.onStop();
        }
        
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
                Toast.makeText(this, "You must allow permission to use the camera", Toast.LENGTH_SHORT).show();
                finish();
            }
            
            cameraKitView.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
        
        
        @Override
        public void onClick(View view) {
            if (view == btn_capture) {
                cameraKitView.captureImage(new CameraKitView.ImageCallback() {
                    @Override
                    public void onImage(CameraKitView cameraKitView, final byte[] capturedImage) {
                        // capturedImage contains the image from the CameraKitView.
                        captureSound();
                        BitmapFactory.Options opts = new BitmapFactory.Options();
                        Bitmap bitmap = BitmapFactory.decodeByteArray(capturedImage, 0, capturedImage.length, opts);
                        // FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap);
                        MLFrame frame = MLFrame.fromBitmap(bitmap);
                        imageProcessor(frame);
                        dialog.show();
                        cameraKitView.onStop();
                        
                        
                    }
                });
                
            } else if (view == btn_flashlight) {
                switch (flashMode) {
                    case "off":
                        flashMode = "on";
                        flash("on");
                        SharedHelper.putKey(this, "flashMode", "on");
                        break;
                    case "on":
                        flashMode = "auto";
                        flash("auto");
                        SharedHelper.putKey(this, "flashMode", "auto");
                        break;
                    case "auto":
                        flashMode = "off";
                        flash("off");
                        SharedHelper.putKey(this, "flashMode", "off");
                        break;
                }
                
                
            }
        }
        
        private void imageProcessor(MLFrame frame) {
            MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer();
            
            Task<MLText> task = analyzer.asyncAnalyseFrame(frame);
            task.addOnSuccessListener(new OnSuccessListener<MLText>() {
                @Override
                public void onSuccess(MLText text) {
                    Toast.makeText(CameraActivity.this, text.getStringValue(), Toast.LENGTH_SHORT).show();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(Exception e) {
                    Toast.makeText(CameraActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }
        
        public void captureSound(){
            AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            switch( audio.getRingerMode() ){
                case AudioManager.RINGER_MODE_NORMAL:
                    MediaActionSound sound = new MediaActionSound();
                    sound.play(MediaActionSound.SHUTTER_CLICK);
                    break;
                case AudioManager.RINGER_MODE_SILENT:
                    break;
                case AudioManager.RINGER_MODE_VIBRATE:
                    break;
            }
        }
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    
    -<androidx.constraintlayout.widget.ConstraintLayout tools:context=".CameraActivity" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android">
    
    <com.camerakit.CameraKitView android:layout_height="0dp" android:layout_width="match_parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/btn_capture" app:camera_permissions="camera" app:camera_focus="continuous" app:camera_flash="auto" app:camera_facing="back" android:keepScreenOn="true" android:adjustViewBounds="true" android:id="@+id/camera"> </com.camerakit.CameraKitView>
    
    <ImageView android:layout_height="50dp" android:layout_width="match_parent" app:layout_constraintBottom_toTopOf="@id/btn_flashlight" android:id="@+id/btn_capture" android:src="@drawable/take_photos"/>
    
    <ImageView android:layout_height="50dp" android:layout_width="match_parent" android:id="@+id/btn_flashlight" android:src="@drawable/flashlight_off" app:layout_constraintBottom_toBottomOf="parent"/>
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2019-12-16
      • 2021-06-29
      • 2014-08-31
      • 2013-12-31
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多