Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 프로그래밍 방식으로 수신함의 SMS를 삭제하는 방법

이 글에서는 안드로이드에서 프로그래밍 방식으로 수신함(Inbox)에 저장된 SMS 메시지를 삭제하는 방법을 단계별로 알아봅니다. 핵심은 ContentResolver를 통해 SMS 콘텐츠 프로바이더에 접근해 삭제 요청을 보내는 것입니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File → New Project를 선택하여 새 프로젝트를 만듭니다. 프로젝트 생성에 필요한 모든 세부 정보를 입력한 뒤 진행하세요.

2단계 — 레이아웃 작성 (res/layout/activity_main.xml)

아래 코드를 res/layout/activity_main.xml 파일에 추가합니다. 화면 중앙에 'Delete SMS' 버튼 하나를 배치하는 간단한 레이아웃입니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/bt_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Delete SMS"
        android:layout_centerInParent="true" />
</RelativeLayout>

3단계 — 메인 액티비티 구현 (src/MainActivity.java)

버튼 클릭 시 deleteSMS() 메서드를 호출하여 수신함의 모든 SMS를 삭제하고, 그 결과를 토스트(Toast) 메시지로 알려주는 코드입니다.

import android.content.Context;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        Button btn = (Button) findViewById(R.id.bt_delete);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (deleteSMS()) {
                    Toast.makeText(mContext, "Your message is deleted.", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(mContext, "Sorry we can't delete messages.", Toast.LENGTH_LONG).show();
                }
            }
        });
    }
    private boolean deleteSMS() {
        boolean isDeleted = false;
        try {
            mContext.getContentResolver().delete(Uri.parse("content://sms/"), null, null);
            isDeleted = true;
        } catch (Exception ex) {
            isDeleted = false;
        }
        return isDeleted;
    }
}

deleteSMS() 메서드 내부를 보면 getContentResolver().delete(Uri.parse("content://sms/"), null, null) 호출 하나로 전체 SMS를 삭제합니다. 만약 특정 메시지만 삭제하고 싶다면 두 번째, 세 번째 인자에 조건(selection)과 조건값(selectionArgs)을 지정하면 됩니다.

4단계 — 매니페스트 권한 설정 (androidManifest.xml)

SMS를 읽고 삭제하려면 READ_SMSWRITE_SMS 권한이 반드시 필요합니다. 아래와 같이 매니페스트에 선언하세요.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <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>
    </application>
</manifest>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 목록에서 본인의 모바일 기기를 선택하세요. 앱이 실행되면 아래와 같은 기본 화면이 표시됩니다.

안드로이드에서 프로그래밍 방식으로 수신함의 SMS를 삭제하는 방법

안드로이드에서 프로그래밍 방식으로 수신함의 SMS를 삭제하는 방법

참고: 최신 안드로이드 버전에서의 제약 사항

안드로이드 4.4(KitKat) 이상에서는 WRITE_SMS 권한만으로는 SMS를 삭제할 수 없습니다. 시스템 보안 정책상 기본 문자 앱(Default SMS App)으로 지정된 앱만 SMS 데이터베이스를 수정하거나 삭제할 수 있기 때문입니다. 따라서 실제 배포용 앱이라면 사용자에게 기본 문자 앱으로 설정하도록 유도하거나, SmsManager 및 기본 문자 앱 역할에 필요한 추가 설정을 함께 고려해야 합니다. 또한 타깃 SDK가 23(API 23) 이상이라면 매니페스트 선언 외에 런타임 권한 요청 처리도 필수입니다.