2017-03-04 9 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

안드로이드 6.0 (API 23)에서 주요 활동 자바 클래스에서도 권한을 등록해야한다는 것을 알기에는 너무 오래 걸렸습니다.

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

+0

고맙습니다 !!! !!! –

5

인 텐트 필터에 특정 인 텐트가있는 ndroidManifest.xml.