2015-08-24 17 views
9

के प्रसारण रिसीवर को पंजीकृत करने का प्रयास करते समय "java.lang.reflect.InvocationTargetException" प्राप्त करना मेरे ऐप में एक एम्बेडेड एपीके है, मुझे अपने मुख्य एपीके से आंतरिक एपीके में BroadcastReceiver पंजीकृत करने की आवश्यकता है।एम्बेडेड एपीके

आंतरिक एपीके सिस्टम पर स्थापित नहीं किया जाना है; मुझे इसे गतिशील रूप से लोड करना होगा। इसलिए, मैं आंतरिक एपीके में एक विधि को कॉल करने के लिए प्रतिबिंब का उपयोग कर रहा हूं जिसमें BroadcastReceiver पंजीकृत करने के लिए कोड है। आंतरिक एपीके के इस रिसीवर को संबंधित प्रसारण के लिए आह्वान करना चाहिए।

BroadcastReceiver पंजीकृत करने का प्रयास करते समय मुझे एक त्रुटि मिल रही है। क्या इस तरह से पंजीकृत होने के लिए BroadcastReceiver के लिए भी संभव है, और पूरी तरह कार्यात्मक हो? अपवाद और कोड नीचे

त्रुटि संबंधित लॉग दिए गए हैं:

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` 

मुख्य app से संबंधित कोड:

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

लागू विधि संहिता, "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

आप भीतरी (कारण) NullPointerException कहीं com.example.ea_innerapp.InnerApp.register से कॉल स्टैक नीचे कदाचित समस्या की जांच की थी, लेकिन वह डेटा अपनी पोस्ट में उपलब्ध नहीं है –

+0

@ Matjaž एक प्रकार का अखरोट:। " com.example.ea_innerapp.InnerApp.register "मुख्य ऐप द्वारा लागू विधि है। कोड इस विधि को पोस्ट में दिया गया है, मैं इसे स्पष्ट करने के लिए शीर्षक संपादित कर दूंगा। इस विधि को केवल प्रसारण रिसीवर पंजीकृत करना है। मेरे परीक्षणों के दौरान, आंतरिक ऐप स्वतंत्र रूप से ठीक काम करता है, लेकिन जब मैं आंतरिक एपीके (सिस्टम पर स्थापित नहीं) की इस विधि का आह्वान करता हूं तो मुझे उस अपवाद को उस रेखा पर मिलता है जहां यह रिसीवर – blackfyre

+0

रजिस्टर करने के लिए "रजिस्टर रिसीवर" विधि को कॉल करता है। मुझे यकीन नहीं है कि क्या मुद्दा यह है कि, मुझे लगता है कि यह संदर्भ से संबंधित हो सकता है, लेकिन मुझे नहीं पता कि इसे कैसे ठीक किया जाए – blackfyre

उत्तर

6

मैंने इस मुद्दे को ठीक कर दिया है। मुद्दे की

पहचान:

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) 

मैं "android.content.ContextWrapper.registerReceive" की कोड को देखा मुख्य कारणों का पता लगाने

अपवाद staketrace की मुख्य धारा था। वर्ग ContextWrapper के संबंधित कोड के नीचे

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

रेफरी दिया जाता है .: http://grepcode.com/file/repo1.maven.org/maven2/org.robolectric/android-all/4.4_r1-robolectric-1/android/content/ContextWrapper.java#ContextWrapper.0mBase

त्रुटि लाइन 467 है, जो "return mBase.registerReceiver(receiver, filter);" है पर था। यहां, mBase वर्ग "android.content.Context" का ऑब्जेक्ट है। कक्षा कक्षा में संदर्भ का मूल्य था "com.example.ea_innerapp.InnerApp", क्योंकि यह एम्बेडेड एपीके का वर्ग है। यही कारण है कि मुझे अपवाद मिल रहा था।

समाधान:

मैं एक संदर्भ मूल्य प्रदान करने की जरूरत है। इसलिए, मैंने मुख्य एपीके का संदर्भ "com.example.ea_innerapp.InnerApp.register" पर तर्क के रूप में पारित किया।

"com.example.ea_innerapp.InnerApp.register" "android.content.ContextWrapper.registerReceive", जो पैरामीटर के रूप में संदर्भ प्राप्त नहीं होता है बुला रहा था। इसलिए, मैंने सीधे "android.content.Context.registerReceiver" को मुख्य एपीके द्वारा प्रदान किए गए संदर्भ का उपयोग करके सीधे बुलाया। संशोधित "com.example.ea_innerapp.InnerApp।रजिस्टर " है आप param_ctx का मूल्य बचाने के लिए और जबकि संयुक्त राष्ट्र पंजीकरण रिसीवर इसका इस्तेमाल के साथ-साथ करना होगा कि

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

ध्यान दें, अन्यथा आप त्रुटि प्राप्त होगी। रिसीवर अपंजीकृत करने के लिए आप

फोन करता हूँ ?
ctx.unregisterReceiver(obj_InnerReceiver); // ctx is the value that was passed to "com.example.ea_innerapp.InnerApp.register" 
संबंधित मुद्दे