【问题标题】:Give activity permission in AndroidManifest在 AndroidManifest 中授予活动权限
【发布时间】:2016-07-11 09:06:28
【问题描述】:

我有一个 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>

编辑

如果我将清单文件编辑为此,我会得到 No Activity found to handle Intent 错误。

<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 文件夹吗?
  • 我到底应该看什么?
  • 您使用哪个库进行扫描?
  • 这是一个原生的激光扫描仪,所以我不能使用相机库(设备没有配备相机)。因此,我尝试开发自己的插件,该插件使用 com.hyipc.core.service.barcode.BarcodeService2D 作为意图
  • BarcodeService2D 类需要来自您在应用程序中添加的库(如果是 ndk 库,则可以是 jar 或 .so)或安装在您通过意图调用的设备中的其他应用程序中。

标签: java android cordova android-manifest


【解决方案1】:

从评论列表中的讨论我们知道BarcodeService2D,是一个Service,你可以使用startService成功启动组件。现在问题变成了“如何将数据从我的服务传递到Activity 实例”? StackOverflow 中有很多答案,请参阅thisthis。只需谷歌即可。

对于“所以服务不同于活动?”这个问题,答案是肯定的。 Activity 通常代表应用程序中的屏幕。它包含各种ViewDrawable 和许多其他内容,您可以直接与它进行交互。 Service 通常用于在没有任何 UI 的情况下在后台执行长时间运行的任务。详情请见the developer site

【讨论】:

    【解决方案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 = "";
                }
            }
        }
    

    Broadcast Receivers 他们就像监听和过滤来电的人。

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

     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() 中获得响应时,您可以检查和匹配

    扫描完成后,您将在广播接收器内收到通知,然后您将身份标志与您的唯一标志匹配,如果匹配,则您可以获取可用定义密钥(key-值对)

    public static final String KEY_BARCODE_STR = "key_barcode_string";

    不要忘记在暂停时取消注册您的接收器,以节省电池并减少开销

     @Override
        protected void onPause() {
            super.onPause();
            //close barcodePower
    
            this.unregisterReceiver(mReceiver);
        }
    

    【讨论】:

      【解决方案3】:

      在阅读了上面的讨论后,我达到了以下几点

      1. 如果 BarcodeService2D 是一个 Activity,那么它的 manifest 声明应该是这样的 -

            <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. 如果 BarcodeService2D 是一个服务,那么它的清单声明应该是这样的 -

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

      【讨论】:

        猜你喜欢
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        相关资源
        最近更新 更多