2017-01-09 5 views
2

오전 내 앱에서 수신 SMS 모니터링을 시도합니다. Android 측에서 수신 SMS 모니터링을 위해 API 19에서 변경했습니다.Android API에서 수신 SMS를 모니터링하는 방법 <19 & API > = 19?

백그라운드에서 들어오는 메시지 (백그라운드가 아닌 & 모바일 화면이 꺼진 상태의 앱 시점)를 API 23에 추적 할 수 없습니다.

Android 문서에서 앱이 기본 메시지 앱이 아닌 경우 백그라운드에서 수신 SMS를 추적 할 수 없음 API 19.

참조 : - Getting Your SMS Apps Ready for KitKat

그러나 내 API 21 (LOLLIPOP) 장치의 작동. API 23 (Marshmallow) 기기에서 작동하지 않습니다. 기기 화면이 켜져 있거나 앱이 열려있는 경우 API 23 (마시맬로)에서도 작동합니다.

업데이트 할 수 있습니까? API 23 (마시 멜로우)에 백그라운드에서 수신 메시지를 추적 할 수있는 방법이 있습니까?

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

<receiver 
     android:name=".SMSReceiver" 
     android:enabled="true" 
     android:exported="true" 
     android:permission="android.permission.BROADCAST_SMS"> 
     <intent-filter android:priority="5822"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
</receiver> 

여기

매니페스트 코드 내 자바 코드

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

public class SMSReceiver extends BroadcastReceiver { 

public static final String BROADCAST = "SMS_RECEIVER"; 
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 

Intent broadcast_intent; 
String message_body = "", originAddress; 

StringBuilder bodyText; 

@Override 
public void onReceive(Context context, Intent intent) { 


    if (intent.getAction().equalsIgnoreCase(SMS_RECEIVED)) { 

     broadcast_intent = new Intent(BROADCAST); 

     Bundle bundle = intent.getExtras(); 
     SmsMessage[] messages; 

     if (bundle != null) { 

      Object[] pdus = (Object[]) bundle.get("pdus"); 

      messages = new SmsMessage[pdus.length]; 

      bodyText = new StringBuilder(); 

      for (int i = 0; i < messages.length; i++) { 

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        String format = bundle.getString("format"); 
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format); 
       } else { 
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       } 

       originAddress = messages[i].getOriginatingAddress().toUpperCase(); 
       bodyText.append(messages[i].getMessageBody()); 

      } 

      message_body = bodyText.toString(); 

     } 
    } 
} 
} 

답변

0

기본적으로 당신이 SMS_Receive를 수신하고 다음을 확인하기 위해 방송 수신기를 등록 할 수 있습니다. 앱에서 할 때, 실행되는 동안 도입의 시작 부분에서

Intent intent = getIntent(); 
Bundle bundle = intent.getBundleExtra("mySMS"); 

if (bundle != null) { 
    Object[] pdus = (Object[])bundle.get("pdus"); 
    SmsMessage sms = SmsMessage.createFromPdu((byte[])pdus[0]); 
    Log.i(TAG, "smsActivity : SMS is <" + sms.getMessageBody() +">"); 


    String message = sms.getMessageBody(); 
    //required sms 
    TextView tx = (TextView) findViewById(R.id.TextBox); 
    tx.setText(message);    
} else 
    Log.i(TAG, "smsActivity : NULL SMS bundle"); 
2

는 안드로이드 6.0 (API 23) 구글은> = 23 사용자가 앱에 권한을 부여 할 필요가 API에 대한 응용 프로그램 권한 technique.So에 큰 변화를 만들어 그들이

시스템 승인 정상 위험한 두 가지 범주로 구분되는 응용 프로그램을 설치합니다

  1. 일반 권한을 직접 사용자의 개인 정보를 위험하지 않습니다. 앱이 매니페스트에 정상적인 권한을 나열하면 시스템에서 자동으로 권한을 부여합니다.
  2. 위험한 권한은 사용자의 기밀 데이터에 대한 액세스 권한을 앱에 부여 할 수 있습니다. 앱이 매니페스트에 정상적인 권한을 나열하면 시스템에서 자동으로 권한을 부여합니다. 위험한 권한을 나열하면 사용자가 앱에 명시 적으로 승인을해야합니다. 휴대폰의 SMS 관리자 액세스에 대한

권한은 위험한 권한으로 간주하고 당신이 전화 smsmanager를 사용하려고하는 코드 내부 프로그램이라고해야 할 이유입니다됩니다.

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_SOME_FEATURES_PERMISSIONS: { 
      for(int i = 0; i < permissions.length; i++) { 
       if(grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
        Log.d("Permissions", "Permission Granted: " + permissions[i]); 
       } else if(grantResults[i] == PackageManager.PERMISSION_DENIED) { 
        Log.d("Permissions", "Permission Denied: " + permissions[i]); 
       } 
      } 
     } 
     break; 
     default: { 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
} 

:

이 같은 onActivityResult를 재정의 방법을이

int hasSMSPermission = checkSelfPermission(Manifest.permission.SEND_SMS); 
List<String> permissions = new ArrayList<String>(); 

if(hasSMSPermission != PackageManager.PERMISSION_GRANTED) { 
    permissions.add(Manifest.permission.SEND_SMS); 
} 

if(!permissions.isEmpty()) { 
    requestPermissions(permissions.toArray(new String[permissions.size()]), REQUEST_CODE_SOME_FEATURES_PERMISSIONS); 
} 

처럼 mainActivity에 권한을 요청할 수 있습니다 허가의 요청 결과를 수신하고의 브로드 캐스트 수신기를 설정 자세한 내용은 다음 링크를 참조하십시오. https://developer.android.com/training/permissions/requesting.html

+0

모든 보안 권한 검사가 완료되었습니다. 내가 사용하는 허가. – Yugesh

관련 문제