在AndroidManifest中授予活动权限

3

我有一个 Cordova 插件,可以在设备上运行激光扫描仪,它的 Main.java 代码如下:

package com.example.plugin;

import org.apache.cordova.*;
import org.json.JSONArray;
import org.json.JSONException;


import java.security.PublicKey;

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import android.util.Log;

public class Hello extends CordovaPlugin {
    public static final int REQUEST_CODE = 0x0ba7c0de;

    @Override
    public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {

        if (action.equals("scan")) {
            scan();
            return true;
        } else {
            return false;
        }
    }

    public void scan() {
        Intent intentService = new Intent("com.hyipc.core.service.barcode.BarcodeService2D");
        intentService.putExtra("KEY_ACTION", "UP");

        this.cordova.startActivityForResult((CordovaPlugin) this, intentService, REQUEST_CODE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
       Log.i("scan", "everything works fine");
    }
}

当我运行插件时,错误日志中出现了以下内容:
07-11 12:03:33.541: E/AndroidRuntime(5258): FATAL EXCEPTION: main
07-11 12:03:33.541: E/AndroidRuntime(5258): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.ionicframework.curierapp266167/com.hyipc.core.service.barcode.BarcodeService2D}: java.lang.ClassNotFoundException: Didn't find class "com.hyipc.core.service.barcode.BarcodeService2D" on path: DexPathList[[zip file "/data/app/com.ionicframework.curierapp266167-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.ionicframework.curierapp266167-2, /vendor/lib, /system/lib]]
07-11 12:03:33.541: E/AndroidRuntime(5258):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at android.app.ActivityThread.access$600(ActivityThread.java:162)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at android.os.Handler.dispatchMessage(Handler.java:107)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at android.os.Looper.loop(Looper.java:194)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at android.app.ActivityThread.main(ActivityThread.java:5392)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at java.lang.reflect.Method.invokeNative(Native Method)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at java.lang.reflect.Method.invoke(Method.java:525)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-11 12:03:33.541: E/AndroidRuntime(5258):     at dalvik.system.NativeStart.main(Native Method)
07-11 12:03:33.541: E/AndroidRuntime(5258): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.hyipc.core.service.barcode.BarcodeService2D" on path: DexPathList[[zip file "/data/app/com.ionicframework.curierapp266167-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.ionicframework.curierapp266167-2, /vendor/lib, /system/lib]]

我已将此内容添加到我的AndroidManifest.xml文件中,但我相当确定有些地方存在问题。

<activity android:label="@string/share_name" android:name="com.hyipc.core.service.barcode.BarcodeService2D">
    <intent-filter>
        <action android:name="com.hyipc.core.service.barcode.BarcodeService2D" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

编辑

如果我将我的清单文件编辑为以下内容,我会收到“找不到处理意图的活动”错误。

<activity android:label="@string/share_name" android:name="com.hyipc.core.service.barcode.BarcodeService2D">
    <intent-filter>
        <action android:name="android.intent.action.LAUNCH" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

此外,如果我尝试这样启动活动:
cordova.getActivity().startService(intentService);

扫描仪正常启动,但我不知道如何获取结果。

我认为您可能缺少了一个依赖项。您能否检查一下您的gradle或lib文件夹? - Raghavendra
我应该寻找什么? - Alexandru Pufan
你使用哪个库进行扫描? - Raghavendra
这是一个本地激光扫描仪,所以我不能使用相机库(设备没有配备相机)。因此,我尝试开发自己的插件,该插件使用com.hyipc.core.service.barcode.BarcodeService2D来进行意图处理。 - Alexandru Pufan
BarcodeService2D类需要从您在应用程序中添加的库(如果是ndk lib,则为jar或.so)或在您的设备上安装的其他应用程序中,通过意图调用该类。 - QuickFix
显示剩余5条评论
3个回答

3
从评论列表的讨论中我们知道,BarcodeService2D是一个Service,你可以使用startService成功地启动该组件。现在问题变成了“如何将数据从我的服务传递到Activity实例”?在StackOverflow上有很多答案,参见这里这里。只需在谷歌上搜索即可。
至于问题“那么服务与活动不同吗?”答案是肯定的。一个Activity通常代表应用程序中的一个屏幕。它包含各种ViewDrawable和其他许多东西,您可以直接与它交互。Service通常用于在后台执行长时间运行的任务而没有任何UI。有关详细信息,请参见开发人员网站

2

首先,似乎条码扫描器在您的情况下是一个服务,因此请将其用作服务并将其注册为服务。然后,看起来您需要在类内创建一个内部广播接收器,如下所示(来自其他帖子)

 public class BarcodeReceiver extends BroadcastReceiver {
        public void onReceive(Context ctx, Intent intent) {
            if (intent.getAction().equals(ACTION_BARCODE_SERVICE_BROADCAST)) {
                    strBarcode = intent.getExtras().getString(KEY_BARCODE_STR);
                    tvBarcode.setText(strBarcode);
                    strBarcode = "";
            }
        }
    }

广播接收器就像是监听和过滤传入电话的人。

在活动顶部创建此接收器的对象。

 private BroadcastReceiver mReceiver = new BarcodeReceiver();

然后,您需要在简历中注册它,并使用意图过滤器(这样您就不必在清单中注册它),并重启服务(以防屏幕开/关)。

 @Override
    protected void onResume() {
        super.onResume();
        intentService.putExtra(KEY_ACTION, "INIT");
        this.startService(intentService);

        // register receiver
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_BARCODE_SERVICE_BROADCAST);
        this.registerReceiver(mReceiver, filter);

    }

请注意filter.addAction语句,它就像你自己的独特标识符,这样当你在广播接收器的onReceive()方法中收到响应时,你可以检查并匹配。

最后,在扫描完成时,您将在广播接收器中收到通知,然后将标识符与您的唯一标识符进行匹配,如果匹配,则可以提取可用的带有定义键(键值对)的数据。

public static final String KEY_BARCODE_STR = "key_barcode_string";

别忘了在onPause()中取消注册接收器,以节省电池电量并减少开销。

 @Override
    protected void onPause() {
        super.onPause();
        //close barcodePower

        this.unregisterReceiver(mReceiver);
    }

1
在阅读上述讨论后,我得出了以下结论。
  1. If BarcodeService2D is an Activity then its manifest declaration should be like this -

        <activity
        android:name="com.hyipc.core.service.barcode.BarcodeService2D"
        android:label="@string/share_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
  2. If BarcodeService2D is an Service then its manifest declaration should be like this -

    <service android:name="com.hyipc.core.service.barcode.BarcodeService2D">
        <intent-filter>
            /*Your Service specific intent filters should be here*/
        </intent-filter>
    </service>
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接