2

私はAndroidを初めて使用し、新しいメッセージが届いたときにテキストメッセージの番号を取得しようとしています。これには、ブロードキャスト受信機を使用しています。しかし、新しいメッセージが来ると、私の「ブロードキャスト受信者」クラスが機能しません。誰かが私が問題を見つけるのを手伝ってくれる?以下に私のコードを与えます。

public class MainActivity extends Activity
{
     @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_layout);
    }


     public class MyBroadcastReciever extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String smsnumber = "";         
        if (bundle != null)
        {
            //---retrieve the sender number SMS received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];            
            for (int i=0; i<msgs.length; i++)
            {
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                smsnumber =  msgs[i].getOriginatingAddress();         
            }
        } 
    }
}

}

マニフェストで受信タグを付けました。

 <receiver android:name="com.aucupa.iack.MyBroadcastReciever" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

SMSを受信するための使用許可も与えられます。

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

しかし、SMSがMyBroadcastRecieverクラスから応答しない場合、デバッグすると、コントロールがMyBroadcastRecieverクラスに到達しません。plzは私が問題を見つけるのを助けます

ついに私はあなたのすべての助けから答えを得て、ここに私の答えを与えました。

 public class MainActivity extends Activity
{

  MyBroadcastReciever broadcastreciever = new MyBroadcastReciever();
  static final String SOME_ACTION = "android.provider.Telephony.SMS_RECEIVED";
  IntentFilter intentFilter = new IntentFilter(SOME_ACTION);

  Intent i = new Intent(SOME_ACTION);
 @Override
protected void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);

sendBroadcast(i);
context.registerReceiver(broadcastreciever, intentFilter);
}


 public class MyBroadcastReciever extends BroadcastReceiver
{

@Override
public void onReceive(Context context, Intent intent) 
{
   if (intent.getAction() == "android.provider.Telephony.SMS_RECEIVED"){
    Bundle bundle = intent.getExtras();        
    SmsMessage[] msgs = null;
    String smsnumber = "";         
    if (bundle != null)
    {
        //---retrieve the sender number SMS received---
        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];            
        for (int i=0; i<msgs.length; i++)
        {
            msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
            smsnumber =  msgs[i].getOriginatingAddress();         
        }
    } 
 }
}
}

}
4

5 に答える 5

2

BroadcastReceiverを拡張するMyBroadcastRecieverで、onReceive()内でこのコードを試してください

 if (intent.getAction() == android.provider.Telephony.SMS_RECEIVED) {
                Bundle bundle = intent.getExtras();
                if (bundle != null) {
                       // your rest of code

                }
            }
于 2013-03-25T04:56:30.527 に答える
1

BroadcastReceiver問題は、マニフェスト宣言の登録/登録解除と削除にあると思います。

からのメッセージをリッスンする必要がReceiveMessagesある内部クラスとして定義します。ActivityService

次に、...などのクラス変数を宣言します。

 ReceiveMessages myReceiver = null;
 Boolean myReceiverIsRegistered = false;

onCreate()使用中myReceiver = new ReceiveMessages();

それからonResume()...

if (!myReceiverIsRegistered) {
    registerReceiver(myRecever, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE"));
    myReceiverIsRegistered = true;
}

...そしてonPause()...

if (myReceiverIsRegistered) {
    unregisterReceiver(myReceiver);
    myReceiverIsRegistered = false;
}

作成しServiceてブロードキャストするIntent...

Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE");
sendBroadcast(i);

そしてそれはそれについてです。たとえば、私の例のように、パッケージ/アプリに固有の「アクション」を作成しますcom.mycompany...。これは、他のアプリまたはシステムコンポーネントがそれを処理しようとする可能性がある状況を回避するのに役立ちます。

于 2013-03-25T06:50:06.887 に答える
0

コードをクリーンアップして再構築してみてください。場合によっては、コードを更新する際にクリーニングを行う必要があります。

双方向で登録する必要があります。

静的および動的

詳細については、このリンクを参照してください。

また

Uri uriSMSURI = Uri.parse("content://sms/");
    Cursor cur = mContext.getContentResolver().query(uriSMSURI, null, null,null, null);
    cur.moveToFirst();
       id = cur.getString(cur.getColumnIndex("thread_id"));        
       protocol = cur.getString(cur.getColumnIndex("protocol"));
       Long date=cur.getLong(cur.getColumnIndex("date"));
       type = cur.getInt(cur.getColumnIndex("type"));
       String address=cur.getString(cur.getColumnIndex("address"));

       System.out.println("READING LOG...."+"\n thread_id:"+id+"\n protocol:"+protocol+"\n type:"+type+"\n address"+address);
           if(protocol==null && (type==2 || type==4 || type==6)){
             Log.i("======TEST====", "MESSAGE SENT.......number:"+address);
           }else if(protocol!=null && type==1){               
                Log.i("======TEST====", "MESSAGE RECEIVE.......number:"+address);
           }else{
            //something message
           }

これを試してください。

于 2013-03-23T07:56:09.437 に答える
0

マニフェストでは、このPremissionを使用します

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

     <receiver android:name="net.app.sms.MessageReceiver" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

これを試して...

編集済み

     <receiver android:name="Your PackageName.ClassName" >
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
于 2013-03-23T06:41:48.643 に答える
0

定義されたBroadcastReceiverのインテントを受信するには、次のようにAndroidManifest.xmlで受信者を削除します。

<receiver android:name="full qualified name of your receiver">
    <action android:name="the action interests you"/>
</receiver>

または、Context.registerReceiverに登録します。

Context.registerReceiver(receiver, intentFilter);

そうしないと、システムは受信機が存在することを知ることができません。一部の特別な機密性の高いインテント(SMSなど)については、AndroidManifest.xmlで権限を削除する必要もあります。

于 2013-03-23T07:04:36.203 に答える