Android

[Android] 주소록에서 연락처 창 노출 후 선택시 문자 전송

Question영 2019. 11. 12. 10:40
반응형

Android 에서 주소록 연락처 창 노출 후 선택시 문자 전송하는 로직을 Java 오 Kotlin 버전으로 구현한 예제를

 

간략하게 작성하여 포스팅합니다.

 

전제 코드는 아니고 핵심이 되는 코드들만 넣어놨고

 

Native 는 클릭 이벤트시 메서드 호출 하이브리드는 JavascriptInterface 를 활용하여 호출해주세요.

 

시작되는 메서드는 startSMS() 입니다

 

# Ver. Java

public class ContactActivity extends AppCompatActivity {

    private static final String TAG = ContactActivity.class.getSimpleName();

    private String sendMsg = "";

    //...

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == RESULT_OK) {
            sendSMS(data, sendMsg);
        }
        super.onActivityResult(requestCode, resultCode, data);
    }


    private void startSMS() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setData(ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
        startActivityForResult(intent, 0);
    }

    private void sendSMS(Intent data, String msg) {
        Cursor cursor = getContentResolver().query(data.getData(),
                new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null);
        cursor.moveToFirst();
        String name = cursor.getString(0);     //0은 이름을 얻어옵니다.
        String number = cursor.getString(1);   //1은 번호를 받아옵니다.

        cursor.close();

        ((TextView)findViewById(R.id.resMsg)).setText("name : " + name + " number : " + number);

        Uri n = Uri.parse("smsto: " + number);
        Intent intent = new Intent(Intent.ACTION_SENDTO, n);
        intent.putExtra("sms_body", msg);
        startActivity(intent);
    }

    public class JavaScriptInterface {

        /**
         *
         */
        @JavascriptInterface
        public void sendSMS(String msg) {
            sendMsg = msg;
            Toast.makeText( ContactActivity.this, msg, Toast.LENGTH_SHORT).show();
            startSMS();
        }
    }
}

# Ver. Kotlin

class ContactActivity : AppCompatActivity() {

    private var sendMsg = ""

        //...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (resultCode == Activity.RESULT_OK) {
            sendSMS(data!!, sendMsg)
        }
        super.onActivityResult(requestCode, resultCode, data)
    }

    /**
     * 주소록 검색
     */
    private fun startSMS() {
        val intent = Intent(Intent.ACTION_PICK)
        intent.data = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
        startActivityForResult(intent, 0)
    }

    /**
     * 문자 전송
     */
    @SuppressLint("SetTextI18n")
    private fun sendSMS(data: Intent, msg: String) {

        with(contentResolver) {
            query(
                data.data, arrayOf(
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.NUMBER
                ), null, null, null
            )
        }?.apply {
            moveToFirst()
            val name = getString(0)     //0은 이름을 얻어옵니다.
            val number = getString(1)   //1은 번호를 받아옵니다.

            close()

            (findViewById<View>(R.id.res_msg) as TextView).text = "name : $name number : $number"

            val n = Uri.parse("smsto: $number")
            val intent = Intent(Intent.ACTION_SENDTO, n)
            intent.putExtra("sms_body", msg)
            startActivity(intent)
        }
    }

    inner class JavaScriptInterface {

        /**
         *
         */
        @JavascriptInterface
        fun sendSMS(msg: String) {
            sendMsg = msg
            startSMS()
            Toast.makeText(this@ContactActivity, msg, Toast.LENGTH_SHORT).show()
        }
    }
}

 

참고 바랍니다.

 

감사합니다.

반응형