2015-08-24 19 views
9

La mia app ha un APK incorporato, ho bisogno di registrare un BroadcastReceiver nell'APK interno dal mio APK principale.Ottenere "java.lang.reflect.InvocationTargetException" durante il tentativo di registrare il ricevitore broadcast dell'apk incorporato

L'APK interno non deve essere installato sul sistema; Devo caricarlo in modo dinamico. Quindi, sto usando reflection per chiamare un metodo nell'APK interno che ha il codice per registrare lo BroadcastReceiver. Questo ricevitore dell'APK interno dovrebbe invocare per la trasmissione correlata.

Si è verificato un errore durante il tentativo di registrare il numero BroadcastReceiver. È anche possibile che uno BroadcastReceiver sia registrato in questo modo e sia perfettamente funzionante? Eccezione e il codice sono riportati di seguito

Registro errori correlati:

08-24 08:31:26.915: D/MainApp(1957): invoke method 
08-24 08:31:26.955: D/InnerApp(1957): Register receiver 
08-24 08:31:26.955: W/System.err(1957): java.lang.reflect.InvocationTargetException 
08-24 08:31:26.965: W/System.err(1957):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-24 08:31:26.965: W/System.err(1957):  at java.lang.reflect.Method.invoke(Method.java:515) 
08-24 08:31:26.965: W/System.err(1957):  at com.example.ea_mainapp.MainApp.invokeService(MainApp.java:105) 
08-24 08:31:26.965: W/System.err(1957):  at com.example.ea_mainapp.MainApp.onCreate(MainApp.java:40) 
08-24 08:31:26.965: W/System.err(1957):  at android.app.Activity.performCreate(Activity.java:5231) 
08-24 08:31:26.975: W/System.err(1957):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
08-24 08:31:26.975: W/System.err(1957):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
08-24 08:31:26.975: W/System.err(1957):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
08-24 08:31:26.975: W/System.err(1957):  at android.app.ActivityThread.access$800(ActivityThread.java:135) 
08-24 08:31:26.975: W/System.err(1957):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
08-24 08:31:26.975: W/System.err(1957):  at android.os.Handler.dispatchMessage(Handler.java:102) 
08-24 08:31:26.975: W/System.err(1957):  at android.os.Looper.loop(Looper.java:136) 
08-24 08:31:26.975: W/System.err(1957):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
08-24 08:31:26.975: W/System.err(1957):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-24 08:31:26.975: W/System.err(1957):  at java.lang.reflect.Method.invoke(Method.java:515) 
08-24 08:31:26.975: W/System.err(1957):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
08-24 08:31:26.975: W/System.err(1957):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
08-24 08:31:26.975: W/System.err(1957):  at dalvik.system.NativeStart.main(Native Method) 
08-24 08:31:26.985: W/System.err(1957): Caused by: java.lang.NullPointerException 
08-24 08:31:26.985: W/System.err(1957):  at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:467) 
08-24 08:31:26.985: W/System.err(1957):  at com.example.ea_innerapp.InnerApp.register(InnerApp.java:50) 
08-24 08:31:26.985: W/System.err(1957):  ... 18 more` 

codice collegato di applicazione principale:

// invoke method 
Log.d(TAG,"invoke method"); 

final String apkFile =TARGET_BASE_PATH+"EA_innerApp.apk"; 
String className = "com.example.ea_innerapp.InnerApp"; 
String methodToInvoke = "register"; 

final File optimizedDexOutputPath = getDir("outdex", 0); 

DexClassLoader dLoader = new DexClassLoader(apkFile,optimizedDexOutputPath.getAbsolutePath(), 
       null,ClassLoader.getSystemClassLoader().getParent()); 

try { 
    Class<?> loadedClass = dLoader.loadClass(className); 
    Object obj = (Object)loadedClass.newInstance(); 
    @SuppressWarnings("rawtypes") 
    Class noparams[] = {}; 
    Method m = loadedClass.getMethod(methodToInvoke, noparams); 
    Object oNoparams[] = {}; 
    m.invoke(obj, oNoparams); 
} catch (ClassNotFoundException e) {.... 
} catch (InvocationTargetException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Codice di metodo richiamato, "com.example.ea_innerapp.InnerApp.register" :

Log.d(TAG, "Register receiver"); 
IntentFilter filter=new IntentFilter(); 
filter.addAction("com.example.ea_mainapp.i"); 
registerReceiver(obj_InnerReceiver,filter); 
+0

hai indagare l'interno (causa) NullPointerException Apparentemente il problema da qualche parte lungo lo stack di chiamate da com.example.ea_innerapp.InnerApp.register, ma che i dati non è disponibile nel tuo post –

+0

@ Matjaž Pecan:? ". com.example.ea_innerapp.InnerApp.register "è il metodo richiamato dall'app principale questo metodo è indicato nel post, modifico l'intestazione per renderlo chiaro. Questo metodo deve semplicemente registrare un ricevitore broadcast. Durante i miei test, l'app interna funziona in modo indipendente, ma quando invoco questo metodo di apk interno (non installato sul sistema), ottengo quell'eccezione sulla riga dove chiama il metodo "registerReceiver" per registrare il ricevitore – blackfyre

+0

Non sono sicuro di cosa il problema è, penso che potrebbe essere correlato al contesto, ma non so come risolverlo – blackfyre

risposta

6

Ho risolto il problema.

Identificazione del problema:

sezione principale di eccezione staketrace era

08-24 08:31:26.985: W/System.err(1957): Caused by: java.lang.NullPointerException 
08-24 08:31:26.985: W/System.err(1957):  at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:467) 
08-24 08:31:26.985: W/System.err(1957):  at com.example.ea_innerapp.InnerApp.register(InnerApp.java:50) 

ho guardato il codice di "android.content.ContextWrapper.registerReceive" per trovare la causa principale. codice relativo di classe ContextWrapper è riportata qui sotto

464 @Override 
465 public Intent registerReceiver(
466  BroadcastReceiver receiver, IntentFilter filter) { 
467  return mBase.registerReceiver(receiver, filter); 
468 } 

Ref .: http://grepcode.com/file/repo1.maven.org/maven2/org.robolectric/android-all/4.4_r1-robolectric-1/android/content/ContextWrapper.java#ContextWrapper.0mBase

errore era in linea 467, che è "return mBase.registerReceiver(receiver, filter);". Qui, mBase è oggetto della classe "android.content.Context". Il valore del contesto era nullo nella classe "com.example.ea_innerapp.InnerApp", poiché è una classe di apk incorporato. Questo è il motivo per cui stavo ottenendo un'eccezione.

Soluzione:

avevo bisogno di fornire un valore di contesto. Quindi, ho passato Contesto dell'apk principale come argomento a "com.example.ea_innerapp.InnerApp.register".

"com.example.ea_innerapp.InnerApp.register" stava chiamando "android.content.ContextWrapper.registerReceive", che non riceve contesto come parametro. Quindi, ho chiamato direttamente "android.content.Context.registerReceiver", utilizzando il Contesto fornito dall'apk principale. Modificato "com.example.ea_innerapp.InnerApp.register" è

public void register(Context param_ctx){   
     ...... 
     param_ctx.registerReceiver(obj_InnerReceiver,filter); 
    } 

noti che dovrete salvare il valore di param_ctx e usarlo mentre il ricevitore Espletamento delle Nazioni Unite e, in caso contrario si otterrà l'errore. Per annullare la registrazione ricevitore, è chiamata

ctx.unregisterReceiver(obj_InnerReceiver); // ctx is the value that was passed to "com.example.ea_innerapp.InnerApp.register" 
Problemi correlati