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);
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 –
@ 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
Non sono sicuro di cosa il problema è, penso che potrebbe essere correlato al contesto, ma non so come risolverlo – blackfyre