在AndroidManifest中授予活动权限

时间:2016-07-11 09:06:28

标签: java android cordova android-manifest

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

修改

如果我编辑我的清单文件,我发现没有活动来处理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);

扫描仪启动时没有错误,但我不知道如何获得结果。

3 个答案:

答案 0 :(得分:3)

根据评论列表中的讨论,我们知道BarcodeService2DService,您可以成功使用startService启动该组件。现在问题变成&#34;如何将数据从我的服务传递到Activity实例&#34; ? StackOverflow中有很多答案,请参阅thisthis。只需谷歌吧。

对于问题&#34;所以服务与活动不同?&#34;,答案是肯定的。 Activity通常代表应用中的屏幕。它包含各种ViewDrawable和许多其他内容,您可以直接与它进行交互。 Service通常用于在后台执行长时间运行的任务,而无需任何UI。有关详细信息,请参阅the developer site

答案 1 :(得分: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 = "";
            }
        }
    }

specification他们就像是在监听和过滤来电的人。

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

 private BroadcastReceiver mReceiver = new BarcodeReceiver();

然后使用intent过滤器在resume上注册它(这样你就不必在manifest中注册它)并重启服务(打开/关闭屏幕)

 @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”;

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

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

        this.unregisterReceiver(mReceiver);
    }

答案 2 :(得分:1)

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

  1. 如果 BarcodeService2D 是一个活动,那么它的清单声明应该是这样的 -

        <div class="parent">
            <a class="block" href="mylink">
                <article>
                    <img src="http://placehold.it/400/400" alt="" />
                </article>
            </a>
        </div>
  2. 如果 BarcodeService2D 是一个服务,那么它的清单声明应该是这样的 -

    id_pky++