0

Iamは、受信者ファイルのメタデータで指定された値を取得できません。iamはnullポインター例外を取得します。

マニフェストファイルで指定しました

<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

値を取得するときは、常にnullチェックを行う必要があります。

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

「intgafaes.mobileafaes.androidafaes.securesms.ADDFriendSmsReceiver」を取得できないと思います。

..そしてあなたのtrycatchはこのコードでは役に立たない。

何もしません...少なくとも、例外が発生しないように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

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 に答える
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 に答える