2012-04-23 56 views
0

Iam無法獲取接收器文件中元數據中指定的值,iam獲取空指針異常。使用getReceiverInfo時獲取空指針異常

在manifest文件中我已指定

<receiver android:name=".SmsReceiver" > 
      <intent-filter android:priority="10"> 

       <action 
        android:name="android.provider.Telephony.SMS_RECEIVED" 
        android:enabled="true" /> 
       <meta-data android:name="Algorithm" android:value="AES"/> 
      </intent-filter> 
     </receiver> 

,並在reciever IAM指定

public class SmsReceiver extends BroadcastReceiver { 


    @Override 
    public void onReceive(Context context, Intent intent) { 
     // ---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras(); 
     ActivityInfo appi = null; 
     try { 
      appi = context.getPackageManager().getReceiverInfo(new ComponentName(context,"intgafaes.mobileafaes.androidafaes.securesms.ADDFriendSmsReceiver"), PackageManager.GET_META_DATA); 
     } catch (NameNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     Bundle bundle1 = appi.metaData; 

     String value = bundle1.getString("Algorithm"); 
     System.out.println("Value is "+value); 

     if(value.equals("AES")) 
     { 
      System.out.println("entered into onRecieve"); 
     } 

回答

0

你應該始終有當你retreiving值空檢查..

if(appi != null){ 
Bundle bundle1 = appi.metaData; 
} 

我不認爲它能夠得到「intgafaes.mobileafaes.android afaes.securesms.ADDFriendSmsReceiver「

.. 和你嘗試捕捉在這個代碼沒有用的..

它什麼也不做...... ATLEAST它應該有return語句,這樣的簡化版,異常發生..

public class SmsReceiver extends BroadcastReceiver { 


    @Override 
    public void onReceive(Context context, Intent intent) { 
     // ---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras(); 
     ActivityInfo appi = null; 
     try { 
      appi = context.getPackageManager().getReceiverInfo(new ComponentName(context,"intgafaes.mobileafaes.androidafaes.securesms.ADDFriendSmsReceiver"), PackageManager.GET_META_DATA); 
     } catch (NameNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
      return; 
     } 

     Bundle bundle1 = appi.metaData; 

     String value = bundle1.getString("Algorithm"); 
     System.out.println("Value is "+value); 

     if(value.equals("AES")) 
     { 
      System.out.println("entered into onRecieve"); 
     } 
+0

Iam正確獲取包名,但無法檢索元數據標籤中指定算法的值 – user1203673 2012-04-23 04:34:07

0

在reciever我要聲明的意圖過濾器標籤後的元數據標籤的話,我可以使用相同的上述代碼

<receiver android:name=".SmsReceiver" > 
      <intent-filter android:priority="10"> 

       <action 
        android:name="android.provider.Telephony.SMS_RECEIVED" 
        android:enabled="true" /> 

      </intent-filter> 
      <meta-data android:name="Algorithm" android:value="AES"/> 
     </receiver> 
+0

Hi @ user1203673您可以告訴我如何動態聲明上述代碼?我們可以動態創建/註冊一個接收者,我們也可以指定過濾器和動作。所以我的問題是我們如何添加元標籤? – 2013-02-25 06:31:36

0

已指定訪問數據在AndroidManifest的元數據,此元素:

<receiver android:name=".SmsReceiver" > 

如果你想獲得該元素的ActivityInfo你應該叫:

appi = context.getPackageManager().getReceiverInfo(
     new ComponentName(context, "<yourrootpackage>.SmsReceiver"), 
     PackageManager.GET_META_DATA); 

如果調用此SmsReceiver內(如你在做您提供的代碼),你可能要避免硬編碼字符串,而是做:

appi = context.getPackageManager().getReceiverInfo(
     new ComponentName(context, this.getClass()), 
     PackageManager.GET_META_DATA); 

或者是,只是一個正在使用一個COM查詢信息複製粘貼混亂完全不同的類名?