0

アプリにブロードキャスト レシーバー クラスがあります。メッセージの受信時にオーディオの再生を開始する必要がありますが、メッセージを受信するとすぐにアプリがクラッシュします。

SmsReceiver.java


public class SmsReceiver extends BroadcastReceiver {

    public static final String SMS_EXTRA_NAME = "pdus";
    MediaPlayer mPlay = new MediaPlayer();

    public void onReceive(Context context, Intent intent) {
        // Get the SMS map from Intent
        Bundle extras = intent.getExtras();
        String body = "";
        Context a = null;
        mPlay.create(a, R.raw.sample);
        if (extras != null) {
            // Get received SMS array
            Object[] smsExtra = (Object[]) extras.get(SMS_EXTRA_NAME);

            for (int i = 0; i < smsExtra.length; ++i) {
                SmsMessage sms = SmsMessage.createFromPdu((byte[]) smsExtra[i]);

                body = sms.getMessageBody().toString();
                if (body.equalsIgnoreCase("xxx")) {
                    mPlay.start();
                    this.abortBroadcast();
                }
            }
        }
    }

    public void onKeyDown() {
        mPlay.stop();
    }

    public void onDestroy() {
        mPlay.stop();
    }
}

ログキャット


I/PackageManager(  174): /data/app/com.test.example-2.apk changed; collecting certs
I/PackageManager(  174): /data/app/com.test.example-2.apk changed; unpacking
I/ActivityManager(  174): Start proc com.test.example for broadcast com.test.example/.SmsReceiver: pid=1043 uid=10083 gids={}
E/AndroidRuntime( 1043): java.lang.RuntimeException: Unable to start receiver com.test.example.SmsReceiver: java.lang.NullPointerException
E/AndroidRuntime( 1043):    at com.test.example.SmsReceiver.onReceive(SmsReceiver.java:20)
I/ActivityManager(  174): Process com.test.example (pid 1043) has died.

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.test.example"
  android:versionCode="1"
  android:versionName="1.0">

  <uses-permission android:name="android.permission.WRITE_SMS" />
  <uses-permission android:name="android.permission.READ_SMS" />
  <uses-permission android:name="android.permission.RECEIVE_SMS" />

  <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="11" />

  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">

    <activity
      android:label="@string/app_name"
      android:name=".MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

    <receiver
      android:name=".SmsReceiver"
      android:exported="true">
      <intent-filter android:priority="999">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
      </intent-filter>
    </receiver>
  </application>
</manifest>

これを修正するにはどうすればよいですか?

4

5 に答える 5

1
java.lang.RuntimeException: Unable to start receiver com.test.example.SmsReceiver:     java.lang.NullPointerException
  E/AndroidRuntime( 1043):  at com.test.example.SmsReceiver.onReceive(SmsReceiver.java:20)

そこに NullPointer があります。SmsReceiver.java の 20 行目で何が起こっていますか?

mPlay が null になる可能性はありますか?

于 2013-08-15T19:09:54.553 に答える
1

変化する

Context a = null;
mPlay.create(a, R.raw.sample);

することが

mPlay.create(context, R.raw.sample);
于 2013-08-15T19:11:38.247 に答える
0

コンテキストが null です。次を参照してください。

Context a = null;
mPlay.create(a, R.raw.sample);

やったほうがいい:

Context a = context;
mPlay.create(a, R.raw.sample);

抱擁。

于 2013-08-15T19:12:21.097 に答える
0

私が目にする最初の潜在的な問題はここにあります

Context a = null;

これはあるべきです

Context a = context;

あなたはそれにcontext合格したので、それを作る理由はありませんnull

于 2013-08-15T19:12:35.920 に答える
0

SmsReceiver.java の 20 行目で初期化せずにオブジェクト参照を使用しています。それを初期化します。

mPlay.create(a, R.raw.sample);

上記の行では、a を null として渡しています。成功する

mPlay.create(this, R.raw.sample);
于 2013-08-15T19:12:41.173 に答える