2016-07-11 2 views
3

У меня есть плагин Кордовы, который работает лазерный сканер на устройстве, чей Main.java выглядит следующим образом:Дайте разрешение активности в AndroidManifest

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> 

EDIT

Если я изменить свой файл манифеста на это, я получаю никакой активности не найдено для обработки 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); 

Сканер начинается без ошибок, но я не знаю, как получить свой результат.

+0

Я думаю, вы пропустили зависимость.? Можете ли вы проверить свою папку gradle или lib? – Raghavendra

+0

За что же я должен смотреть? –

+0

Какая библиотека используется для сканирования? – Raghavendra

ответ

3

Из обсуждения в списке комментариев известно, что BarcodeService2D, является Service, и вы можете запустить компонент с помощью startService. Теперь возникает вопрос: «Как я могу передать данные из моего сервиса в экземпляр Activity»? В StackOverflow так много ответов, см. this и this. Просто Google для этого.

И на вопрос «Значит, услуга отличается от деятельности?», Ответ «да». Activity обычно представляет собой экран в приложении. Он содержит множество View, Drawable и многие другие материалы, и вы можете напрямую взаимодействовать с ним. A Service обычно используется для выполнения долгосрочной задачи в фоновом режиме без какого-либо пользовательского интерфейса. Для подробной информации см the developer site

1

После прочтения выше обсуждения я достиг к следующим моментам

  1. Если BarcodeService2D является активность, то его манифест заявления должно быть, как это -

    <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> 
    
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); 
    }