-
[안드로이드] sms 수신 시 특정 문자가 포함 되어 있을 때 포착해서 네이버 검색 화면 띄우기안드로이드(java)/기능 관련 2018. 12. 4. 17:31
sms 수신 시 특정 문자가 포함 되어 있을 때 포착해서 네이버 검색 화면 띄우기
오늘은 저번에 포스팅 한 permission(권한)을 포함한 내용 입니다.
우선은 버전을 맞춰줘야 합니다.
저는 버전을 테스트 해보기 위해서 최소 버전을 23으로 지정하고 프로젝트를 생성하였습니다.
<app 수준 gradle>
12345678910111213141516171819202122232425262728apply plugin: 'com.android.application'android {compileSdkVersion 28defaultConfig {applicationId "com.example.smsproject"minSdkVersion 23targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support.constraint:constraint-layout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'com.android.support.test:runner:1.0.2'androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'}cs <Manifest.xml>
123456789101112131415161718192021222324252627282930313233<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.smsproject"><uses-permission android:name="android.permission.RECEIVE_SMS" /><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"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><receiverandroid:name=".SMSReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter></receiver></application></manifest>cs <MainActivity.java>
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879package com.example.smsproject;import android.Manifest;import android.app.SearchManager;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Build;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;public class MainActivity extends AppCompatActivity {final static String TAG = "MainActivity";private static int REQUEST_SMS_RECEIVE = 1000;WebView webView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);webView = findViewById(R.id.webView);int permissionCheck = 0;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {permissionCheck = ContextCompat.checkSelfPermission(this,Manifest.permission.RECEIVE_SMS);if (permissionCheck == PackageManager.PERMISSION_DENIED) {// no permissionActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS},REQUEST_SMS_RECEIVE);} else {// already have permission}} else {// OS version is lower than marshmallow}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (grantResults[0] == PackageManager.PERMISSION_GRANTED){// if granted} else {// if denied}}@Overrideprotected void onResume() {super.onResume();Intent intent = getIntent();String content = intent.getStringExtra("contents");Log.d(TAG, "## main content : " + content);if (content == null){webView.setWebViewClient(new WebViewClient());} else {if (content.contains(":")){String[] search = content.split(":");Log.d(TAG, "## main search : " + search[1]);webView.setWebViewClient(new WebViewClient());webView.loadUrl("http://search.naver.com/search.naver?chrome=UTF-8&query=" + search[1]);} else {Toast.makeText(this, "검색어 형식이 잘 못 되었습니다.", Toast.LENGTH_SHORT).show();}}}}cs MainActivity에서는 퍼미션 체크하고, 권한을 부여 받았다면 sms를 수신할 수 있게 됩니다.
문자로 넘어온 내용 형식은 "검색:한국" 이런식으로 지정해서 보낼 예정입니다.
전달 받은 내용을 띄워줄 webview를 지정하고 위에 처럼 만들어 줍니다.
위 코드 중에서 webView.loadUrl 안에 들어있는 url은 네이버 검색을 할 수 있는 쿼리스트링 입니다.
http://search.naver.com/search.naver?chrome=UTF-8&query= 뒷부분에 원하는 검색 내용을 쓰면 바로 검색 화면으로 이동하게 됩니다.
<SMSReceiver.java>
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152package com.example.smsproject;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Build;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;import android.widget.Toast;public class SMSReceiver extends BroadcastReceiver {final static String SMSReceiverTAG = "SMSReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.d(SMSReceiverTAG, "## sms 리시버 실행 되었음");if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction())){Log.d(SMSReceiverTAG, "## SMS 받아졌음");Bundle bundle = intent.getExtras();Object[] messages = (Object[]) bundle.get("pdus");SmsMessage[] smsMessages = new SmsMessage[messages.length];for(int i=0; i<smsMessages.length; i++) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {String format = bundle.getString("format");smsMessages[i] = SmsMessage.createFromPdu((byte[]) messages[i], format);} else {smsMessages[i] = SmsMessage.createFromPdu((byte[]) messages[i]);}}String contents = smsMessages[0].getMessageBody().toString();Toast.makeText(context, contents, Toast.LENGTH_LONG).show();Log.d(SMSReceiverTAG, "## SMS Message:" + contents);sendToActivity(context, contents);}}private void sendToActivity(Context context, String contents){Intent intent = new Intent(context, MainActivity.class);intent.putExtra("contents",contents);context.startActivity(intent);}}cs broadcast revicer를 받을 수 있도록 onReceive를 사용 합니다.
여기서 문자 내용을 String type의 contents로 담고 그 내용을 sendToActivity를 통해 전달해주게 됩니다.
<activity_main.xml>
1234567891011121314<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><WebViewandroid:id="@+id/webView"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>cs activity_main.xml의 내용은 webView밖에 없습니다.
이제 문자를 보내보도록 하겠습니다.
저는 안드로이드 스튜디오에서 제공하는 에뮬레이터로 진행했습니다.
권한을 요청하는 화면에서 allow 해주고
문자를 보냅니다.
그러면 이런식으로 바로 네이버에서 검색 화면이 나타나게 됩니다.
'안드로이드(java) > 기능 관련' 카테고리의 다른 글
[안드로이드] Retrofit GET 방식 간단 예제 2 (0) 2019.11.14 [안드로이드] Retrofit GET 방식 간단 예제1 (0) 2019.11.14 [안드로이드] FCM 메시지 전송 될 때 진동 되지 않는 증상. (0) 2019.04.03 [안드로이드] ListView 사용하기 (0) 2019.01.30 [안드로이드] RecyclerView 사용하기 (0) 2019.01.27