1

AndroidでのSMS受信機能に対応しようとしています。私は Stackoverflow や他のサイトで多くの関連トピックを読み、メッセージが受信されたこととメッセージをコンソールに出力するだけの非常に単純なクラスを試しましたが、なぜそれが機能しないのかわかりません。

過去にも同様の質問が未解決のままだったようです ( Android - Broadcast Receiver not being fireを参照)

誰かが私のコードの問題を見つけてくれることを願っています。

コード:

package com.storassa.android.smsapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class SmsReceiver extends BroadcastReceiver {

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private static final String TAG = "SMSBroadcastReceiver";

@Override
public void onReceive(Context context, Intent intent) {
System.out.println("Intent recieved: " + intent.getAction());

if (intent.getAction().equals(SMS_RECEIVED)) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[])bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
}
if (messages.length > -1) {
System.out.println("Message recieved: " + messages[0].getMessageBody());
        }
    }
}
     }
}

そしてマニフェスト

<manifest package="com.storassa.android.smsapp"
    android:versionCode="1"
    android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk android:minSdkVersion="6" android:targetSdkVersion="6"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

    <application android:label="@string/app_name" android:permission="android.permission.RECEIVE_SMS">
        <receiver android:name="com.storassa.android.smsapp.SmsReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>

    </application>
</manifest>
4

3 に答える 3

1

私はあなたのコードを試しましたが、うまくいきました。

あなたが参照している投稿には、 setPriority が 999 に設定されているという問題があり、それでもブロードキャストは受信されません。

優先順位を Integer.MAX_VALUE に設定するか、xml の場合は 2147483647 にする必要があります

一部の SMS アプリは、この Integer.MAX_VALUE を優先度として使用するため、受信したすべてのメッセージを「消費」します。

setPriority を Integer.MAX_VALUE または 2147483647 に設定しても問題が解決しない場合は、着信 SMS を処理しているすべてのアプリをアンインストールして、SMS がアプリに届くかどうかを確認してください。

これで問題が解決する場合は、既にインストールされているアプリケーションの 1 つが SMS を消費しています。

これを回避するには、アプリケーションを最初のアプリケーションとして常にインストールします。これにより、常に SMS ブロードキャストを受信する最初のアプリケーションになります。

編集: 優先度を Integer.MAX_VALUE または 2147483647 に設定することはハックであり、おそらく使用しないでください。setPriority() メソッドは、-1000 から 1000 までの優先度のみを示します。ただし、アプリで自分で使用していますが、特定の番号から受信した特定の SMS のみを処理するため、問題はありません。

于 2012-10-08T11:21:24.803 に答える
1

これは、現在のアプリよりも優先度の高い他のアプリケーションもインストールしている場合に発生するため、優先度を上げると機能し始めます。また、この問題が何度も発生しました。あるアプリでは優先度が 100 で、機能していませんでしたが、 999に変更すると動き始めたので、優先度を大きく変えずに設定して、もう一度確認してみてください。

于 2012-12-06T10:48:32.710 に答える
-1
//In on resume and on pause of actvities register the receiver and also in manifest

    protected void onPause(){

        super.onPause();
    unregisterReceiver(SmsReceiver ); 

    }



        protected void onResume()
{


            super.onResume();

            registerReceiver(SmsReceiver , 
                new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

        }


    private BroadcastReceiver SmsReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                        }


        };
于 2012-10-08T11:01:18.520 に答える