0

我无法获取接收方文件的元数据中指定的值,我得到了一个空指针异常。

在我指定的清单文件中

<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>

并在接收者 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");
        }
4

3 回答 3

0

当您检索值时,您应该始终进行空检查..

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

我认为它无法获得"intgafaes.mobileafaes.androidafaes.securesms.ADDFriendSmsReceiver"

..你的try catch在这段代码中没有用..

它什么都不做......至少它应该有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");
        }
于 2012-04-23T04:19:22.597 回答
0

在接收器中,我必须在意图过滤器标签之后声明元数据标签,然后我可以使用上面相同的代码访问数据

<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>
于 2012-04-24T08:39:26.717 回答
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);

还是您使用完全不同的类名查询信息只是复制粘贴混淆?

于 2013-07-31T21:21:51.020 回答