0

SMS メッセージを受信し、アプリケーション内でこのデータを使用する Android アプリケーションを開発しています。アプリケーションを閉じるときに SMS メッセージの BroadCastreceiver を閉じるようにしたいので、メイン アクティビティ内に配置しました。

public class App extends Activity {
 public class SmsReceiver extends BroadcastReceiver {
  ...
 }
 ...
}

マニフェストに追加されます。

    <receiver android:name=".App.SmsReceiver" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

SMS メッセージを受信するまで、アクティビティは正常に実行されます。次に、次のエラーが表示されます。

10-23 15:01:50.019: E/AndroidRuntime(10161): java.lang.RuntimeException: Unable to instantiate receiver be.allys.msgwall.app.App.SmsReceiver: java.lang.ClassNotFoundException: be.allys.msgwall.app.App.SmsReceiver in loader dalvik.system.PathClassLoader[/data/app/be.allys.msgwall.app-1.apk]

これは、受信者クラスが別のクラス内にあるためですか? StackOverflow に関する別の投稿でこのようにするようにアドバイスされたという事実がなければ、それは私にとって考えられる原因のように思えます。

それが理由ではない場合、それは何ですか?どんな助けでも大歓迎です。

4

1 に答える 1

3

マニフェストにインタークラスであるレシーバーを登録する場合は、マニフェストでこのOuterClass$interClassのようにレシーバー名を宣言する必要があります。

<receiver android:name=".App$SmsReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

編集 1:レシーバーを動的に登録する必要があるため、以下のコード スニペットのような 2 つのメソッドが必要です。その後、Activity の onResume を呼び出し、 onPauseregisterSMSReceiver呼び出すことができます。これで問題が解決します。unRegisterSMSReceiver

private void registerSMSReceiver()
{
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(receiver, filter);
}

private void unRegisterSMSReceiver()
{
    unregisterReceiver(receiver);
}
于 2012-10-23T13:34:08.593 に答える