ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [안드로이드] sms 수신 시 특정 문자가 포함 되어 있을 때 포착해서 네이버 검색 화면 띄우기
    안드로이드(java)/기능 관련 2018. 12. 4. 17:31

    sms 수신 시 특정 문자가 포함 되어 있을 때 포착해서 네이버 검색 화면 띄우기


    오늘은 저번에 포스팅 한 permission(권한)을 포함한 내용 입니다.


    (permission 설정 보러 가)


    우선은 버전을 맞춰줘야 합니다.


    저는 버전을 테스트 해보기 위해서 최소 버전을 23으로 지정하고 프로젝트를 생성하였습니다.



    <app 수준 gradle>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    apply plugin: 'com.android.application'
     
    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "com.example.smsproject"
            minSdkVersion 23
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles 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>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?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" />
     
        <application
            android: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>
     
            <receiver
                android: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>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    package 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;
     
        @Override
        protected 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 permission
                    ActivityCompat.requestPermissions(thisnew String[]{Manifest.permission.RECEIVE_SMS},REQUEST_SMS_RECEIVE);
                } else {
                    // already have permission
                }
            } else {
                // OS version is lower than marshmallow
            }
        }
     
        @Override
        public 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
            }
        }
     
        @Override
        protected 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>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    package 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";
     
        @Override
        public 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>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?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">
     
        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
     
    </LinearLayout>
    cs



    activity_main.xml의 내용은 webView밖에 없습니다.


    이제 문자를 보내보도록 하겠습니다.


    저는 안드로이드 스튜디오에서 제공하는 에뮬레이터로 진행했습니다.



    권한을 요청하는 화면에서 allow 해주고


    문자를 보냅니다.




    그러면 이런식으로 바로 네이버에서 검색 화면이 나타나게 됩니다.




    댓글

Designed by Tistory.