2016-07-11 6 views
3

Ich habe eine Cordova-Plugin, das auf einem Gerät einen Laserscanner läuft, dessen Main.java wie folgt aussieht:Aktivität Erlaubnis in AndroidManifest Geben

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

Wenn ich das Plugin laufen, bekomme ich diese im Fehlerprotokoll :

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]] 

ich habe diese auf meine AndroidManifest.xml Datei hinzugefügt, aber ich bin ziemlich sicher, etwas mit ihm nicht stimmt.

<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

Wenn ich meine Manifest-Datei zu dieser bearbeiten, erhalte ich keine Aktivität Intent Fehler behandeln gefunden.

<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> 

Auch, wenn ich versuche, die Aktivität wie folgt zu starten:

cordova.getActivity().startService(intentService); 

Der Scanner ohne Fehler starten, aber ich weiß nicht, wie das Ergebnis zu erhalten.

+0

Ich denke, Sie eine Abhängigkeit verpasst haben.? Kannst du deinen Gradle oder lib Ordner überprüfen? – Raghavendra

+0

Für was genau sollte ich aussehen? –

+0

Welche Bibliothek wird zum Scannen verwendet? – Raghavendra

Antwort

3

Aus der Diskussion in der Kommentarliste wir wissen, dass BarcodeService2D, ein Service ist, und Sie können die Komponente startService erfolgreich starten. Jetzt lautet die Frage "Wie kann ich Daten von meinem Dienst an eine Activity Instanz übergeben"? Es gibt so viele Antworten in StackOverflow, siehe this und this. Einfach googeln.

Und für die Frage "So ein Service ist anders als eine Aktivität?", Ist die Antwort ja. Ein Activity repräsentiert normalerweise einen Bildschirm in einer App. Es hält eine Vielzahl von View, Drawable und viele andere Sachen und Sie können direkt damit interagieren. Ein Service wird normalerweise verwendet, um eine lange laufende Aufgabe im Hintergrund ohne irgendeine UI durchzuführen. siehe die Detailinformationen, the developer site

1

Nach der obigen Diskussion Liest ich auf folgende Punkte erreicht

  1. Wenn BarcodeService2D ist eine Tätigkeit, dann seine offensichtliche Erklärung so sein sollte -

    <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. Wenn BarcodeService2D ein Service ist, sollte seine Manifest-Deklaration wie folgt lauten:

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

Zuerst scheint, wie Barcode-Scanner ein Service in Ihrem Fall ist, so dass es als Dienst nutzen und es als Dienst registrieren dann scheint, wie Sie einen inneren Rundfunkempfänger in Ihrer Klasse wie folgt erstellen müssen (aus dem anderen post)

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 sie sind wie Jungs, die nicht hören und eingehende Anrufe zu filtern.

erstellen Aufgabe dieses Empfängers an der Spitze im Inneren Aktivität

private BroadcastReceiver mReceiver = new BarcodeReceiver(); 

dann mit einem Intent-Filter auf Lebenslauf registrieren (so, dass Sie dies in einem offenkundigen nicht registrieren müssen) und Dienst neu starten (einhüllen Bildschirm ein/aus)

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

    } 

so filter.addAction Aussage bemerken, es ist wie Sie einzigartige Identität Flagge besitzen, so dass u überprüfen und anzupassen, wenn u eine Antwort innerhalb OnReceive() in Ihrem Rundfunkempfänger erhalten

Am Ende des Scanvorgangs werden Sie in Ihrem Broadcast-Empfänger benachrichtigt und dann stimmen Sie das Identitätskennzeichen mit Ihrem eindeutigen Flag ab. Wenn es übereinstimmt, können Sie die Daten abrufen, die mit einem definierten Schlüssel verfügbar sind. Wertepaar)

public static final Zeichenfolge KEY_BARCODE_STR = "key_barcode_string";

vergessen Sie nicht, Ihren Empfänger in, um auf Pause deregistrieren Batterie zu sparen und verringern Kopf

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

     this.unregisterReceiver(mReceiver); 
    }