2017-03-04 18 views
-1

新しいSMSが到着するまで待つシンプルなアプリケーションを構築しようとしています。そこからデータを抽出して処理しています。アプリケーションはバックグラウンドで実行する必要があります。 GUIには、ブロードキャスト受信機を開始/停止するための単一のスイッチ要素があります。アプリが破棄されて画面がロックされていても、ユーザーが手動でオフにしない限り、アプリはまだ動作しているはずです。 私はstackoverflow上のすべてのリソースを検索しました、そして、彼らのほとんどはこの方法でそれを行いました、まだ、それはまだ私のために働かない、と私はなぜ知りません。 Log.d(...)は何も返さないので私は知っています。どんな助けもありがとう。ブロードキャストレシーバが呼び出されていない

enter image description here

ブロードキャストSMSレシーバ

public class SMSReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("RECEIVER", "ENTERED"); 

     if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){ 
      Log.d("RECEIVER", "SMS RECEIVED"); 

      SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent); 
      for(int i = 0; i < 4; i++){ 
       SmsMessage sms = messages[i]; 
       Log.d("Message " + i + 1 + " from: ", sms.getOriginatingAddress()); 
       Toast.makeText(context,"SMS from " + sms.getOriginatingAddress(), Toast.LENGTH_SHORT).show(); 
      } 
     } 

    } 
} 

主な活動

public class MainActivity extends AppCompatActivity { 
    IntentFilter filter; 
    SMSReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     filter = new IntentFilter(); 
     filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
     receiver = new SMSReceiver(); 

     Switch startSwitch = (Switch) findViewById(R.id.startSwitch); 
     startSwitch.setChecked(false); 

     startSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       if(isChecked){ 
        getApplication().registerReceiver(new SMSReceiver(), filter); 
       } else { 
        getApplication().unregisterReceiver(receiver); 
       } 
      } 
     }); 

    } 
} 

マニフェスト

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.ahmad.smsforwarder"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 

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

</manifest> 
+2

マニフェストにあなたのレシーバーがある:私は、主な活動のクラスのonCreate()メソッドに以下の行を追加して問題を修正しましたか? –

答えて

4

Android 6.0(API 23)以降、主なアクティビティJavaクラスでもアクセス権を登録する必要があります。

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_SMS},1);
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},1);

+0

Thanx dude !!! .. –

5

あなたはAに自分の受信機を登録する必要がありますインテントフィルタに特定のインテントを持つndroidManifest.xml

<receiver 
     android:name=".SMSReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
関連する問題