Dar permiso de actividad en AndroidManifest
Tengo un plugin Cordova que ejecuta un escáner láser en un dispositivo, cuyo Main.java se ve así:
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"); } }
Cuando ejecuto el complemento, obtengo esto en el registro de errores:
- NullPointerException con android.support.v7.widget.Toolbar
- el enlace de datos; la etiqueta de la vista no es correcta, Android
- ¿Se pueden cambiar los recursos de un archivo APK de Android sin reconstruir?
- Error al importar nuevo proyecto Gradle: No se pudo obtener el modelo del tipo 'IdeaProject'
- Seleccionador de color de Android: actualizando la matriz de colores
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]]
He añadido esto a mi archivo AndroidManifest.xml, pero estoy bastante seguro de que algo está mal con él.
<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>
EDITAR
Si edito mi archivo de manifiesto a esto, no obtengo ninguna actividad encontrada para manejar el error de intención.
<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>
Además, si intento iniciar la actividad de esta manera:
cordova.getActivity().startService(intentService);
El escáner se inicia sin error, pero no sé cómo obtener el resultado.
- Eclipse se congela todo el tiempo con Ubuntu
- Nuevo PhoneGap 3.0 No se puede resolver la importación org.apache.cordova
- Cómo solucionar el error de webview
- Cuenta-autenticador perdido en mover la aplicación a sdcard
- Cliente TCP \ IP - EHOSTUNREACH (Sin ruta al host)
- Enviar correo automáticamente en fondo en Android
- Las imágenes no se muestran correctamente
- Java.lang.SecurityException: Necesita permiso de BLUETOOTH: Ni el usuario 10065 ni el proceso actual tiene android.permission.BLUETOOTH
De la discusión en la lista de comentarios sabemos que BarcodeService2D
, es un Service
, y puede iniciar el componente utilizando startService
correctamente. Ahora la pregunta se convierte en "¿Cómo puedo pasar los datos de mi servicio a una instancia de Activity
"? Hay muchas respuestas en StackOverflow, vea esto y esto . Sólo google para él.
Y para la pregunta "¿Así que un servicio es diferente de una actividad?", La respuesta es sí. Una Activity
normalmente representa una pantalla en una aplicación. Tiene una variedad de View
, Drawable
y muchas otras cosas y puede interactuar con él directamente. Normalmente se utiliza un Service
para realizar una tarea de ejecución larga en segundo plano sin ninguna interfaz de usuario. Para obtener información detallada, consulte el sitio del desarrollador
En primer lugar parece que el escáner de código de barras es un servicio en su caso por lo que lo utilizan como un servicio y registrarlo como un servicio, entonces parece que usted necesita para crear un receptor de radiodifusión dentro de su clase como este (desde el otro 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 = ""; } } }
Receptores de difusión son como los chicos que escucha y filtrar llamadas entrantes.
crear un objeto de este receptor en la parte superior dentro de la actividad
private BroadcastReceiver mReceiver = new BarcodeReceiver();
a continuación, registrarlo en el curriculum vitae con un filtro de intención (para que no tenga que registrar esto en el manifiesto) y reiniciar el servicio (en caso de encender / apagar la pantalla)
@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); }
así que note la declaración de filter.addAction
es como usted posee el indicador único de la identidad de modo que u pueda comprobar y emparejar cuando u consigue una respuesta dentro de onreceive () dentro de su receptor de la difusión
al final de la exploración se le notificará dentro de su receptor de difusión y, a continuación, coincide con el indicador de identidad con su bandera única y si es coincidencia, entonces puede buscar los datos que estarán disponibles con la clave definida (par clave-valor)
public static final String KEY_BARCODE_STR = "clave_de_código_de_barras";
no olvide anular el registro de su receptor en pausa para ahorrar batería y reducir la sobrecarga
@Override protected void onPause() { super.onPause(); //close barcodePower this.unregisterReceiver(mReceiver); }
Después de leer la discusión anterior llegué a los siguientes puntos
-
Si BarcodeService2D es una actividad, su declaración de manifiesto debería ser así:
<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>
-
Si BarcodeService2D es un servicio, su declaración de manifiesto debe ser así:
<service android:name="com.hyipc.core.service.barcode.BarcodeService2D"> <intent-filter> /*Your Service specific intent filters should be here*/ </intent-filter> </service>
- Documentación para annotation_processors (buck)
- Pasa varios parámetros a través de Firebase Enlaces dinámicos Android