SMS(문자 메시지)에 대한 Android 시스템 작업
1. 문자 보내기
2. 문자 받기
3. 문자 보기
다음은 하나하나 소개한다.일단 문자를 보낸 데모를 한번 볼게요.
핸드폰 번호, 문자 내용 입력;발송 버튼을 누르면 지정된 번호의 휴대전화에 문자를 보낸다.물론 여기는 아주 간단한 데모일 뿐이다. 만약에 좋은 사용자 체험을 하는 앱을 한다면 아직도 판단해야 할 내용이 많다. 1. 핸드폰 번호의 합법성 2. 문자 내용이 너무 길었는지(140글자 이상) 3. 문자 발송 상태의 추적을 하고 사용자에게 이 조작에 대한api를 알려주면 다음에 계속 소개할 것이다.먼저 이 간단한 demo를 보십시오. 문자 발송 조작은 사용자의 개인 정보와 핸드폰 요금과 관련되기 때문에 반드시 사용자의 권한을 받아야 합니다.안드로이드 미니페스트에서.xml 파일에 적절한 사용 권한을 추가하려면 다음과 같이 하십시오.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sendsms"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.SEND_SMS" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity 코드:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
EditText phoneNumberTxt;
EditText msgTxt;
Button sendBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
phoneNumberTxt = (EditText) findViewById(R.id.phone_number_txt);
msgTxt = (EditText) findViewById(R.id.msg_txt);
sendBtn = (Button) findViewById(R.id.send_btn);
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNumber = phoneNumberTxt.getText().toString();
String msg = msgTxt.getText().toString();
if (phoneNumber.length() > 0 && msg.length() > 0) {
sendSMS(phoneNumber, msg);
} else {
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_SHORT).show();
}
}
});
}
private void sendSMS(String number, String message) {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(number, null, message, null, null);
}
}
문자를 보내는 작업은sendSMS 방법에서 주의해야 할 것은 안드로이드 프레임워크에 두 개의 SmsManager가 있다는 것이다.
android.telephony.gsm.SmsManager 및 android.telephony.SmsManager;Api level 4부터 전자는 후자로 대체됐다.후자는 GSM과 CDMA를 동시에 지원하기 때문이다.
위에서 문자를 보내는 조작은 매우 간단하지만 문자를 보내는 전체 과정은 사용자 체험이 매우 나쁘기 때문에 문자를 보낼 수 있습니까?상대방이 이미 받아들였습니까?이것들은 모두 알림이 없다.더 나은 사용자
체험은sendTextMessage라는 API를 자세히 읽어야 한다.
destinationAddress
the address to send the message to
scAddress is the service center address or null to use the current default SMSC
text the body of the message to send sentIntent
if not NULL this PendingIntent is broadcast when the message is successfully sent, or failed. The result code will be Activity.RESULT_OK for success, or one of these errors:
RESULT_ERROR_GENERIC_FAILURE
RESULT_ERROR_RADIO_OFF
RESULT_ERROR_NULL_PDU
For RESULT_ERROR_GENERIC_FAILURE the sentIntent may include the extra "errorCode"containing a radio technology specific value, generally only useful for troubleshooting.The per-application based SMS control checks sentIntent. If sentIntent is NULL the caller will be checked against all unknown applications, which cause smaller number of SMS to be sent in checking period.
deliveryIntent
if not NULL this PendingIntent is broadcast when the message is delivered to the recipient. The raw pdu of the status report is in the extended data ("pdu").
여기에 다섯 개의 매개 변수를 간단하게 묘사한다
destinationAddress 문자의 목표 주소, 즉 문자가 보낼 핸드폰 번호
scAddress 이 주소에 대해wiki 문서를 볼 수 있습니다http://en.wikipedia.org/wiki/Short_message_service_center, 특별한 지정 없이 null로 설정
텍스트
sentIntent 문자 메시지가 성공적으로 전송된 후 전송되는 Pending Intent(Pending Intent에 관해서는 당분간 표시하지 않고 뒤에 글을 써서 소개할 것입니다. 문자가 발송된 후에 사용자에게 성공을 알리는 코드를 호출할 수 있다는 것만 알 수 있습니다.)
delivery Intent 역시 펜딩 Intent로, 상대방이 문자를 받은 뒤 송신하는 라디오다.
여기서 알아야 할 것은 문자를 보내는 것은 점대점(P2P)이 아니라 A가 B에게 문자를 보내는 것은 바로 B에 보내는 것이 아니라 중간에 운영자를 거쳐야 한다는 것이다.그래서 두 단계로 나뉘는데 첫 번째 단계는 문자메시지를 운영자에게 성공적으로 보내는 것이고, 두 번째 단계는 운영자가 목표 사용자에게 성공적으로 보내는 것이다.
그래서 여기에는 sentIntent, deliveryIntent 두 개의 PendingIntent가 나타납니다.이 두 입구점을 찾으면 코드를 추가하여 좋은 사용자 체험을 완성할 수 있다.
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private static final String SENT = "SENT_SMS";
private static final String DELIVERED = "DELIVERED_SMS";
EditText phoneNumberTxt;
EditText msgTxt;
Button sendBtn;
BroadcastReceiver sentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, "sent receiver onReceive");
switch (getResultCode()) {
case SmsManager.RESULT_ERROR_NO_SERVICE:
showToast(" ");
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
showToast(" ");
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
showToast(" ");
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
showToast(" ");
break;
case Activity.RESULT_OK:
showToast(" ");
break;
default:
break;
}
}
};
BroadcastReceiver deliveredReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
showToast(" ");
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
phoneNumberTxt = (EditText) findViewById(R.id.phone_number_txt);
msgTxt = (EditText) findViewById(R.id.msg_txt);
sendBtn = (Button) findViewById(R.id.send_btn);
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNumber = phoneNumberTxt.getText().toString();
String msg = msgTxt.getText().toString();
if (phoneNumber.length() > 0 && msg.length() > 0) {
sendSMSWithMonitor(phoneNumber, msg);
} else {
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(sentReceiver, new IntentFilter(SENT));
registerReceiver(deliveredReceiver, new IntentFilter(DELIVERED));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(sentReceiver);
unregisterReceiver(deliveredReceiver);
}
private void sendSMSWithMonitor(String number, String message) {
PendingIntent sendPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(number, null, message, sendPendingIntent, deliveredPendingIntent);
}
private void showToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}
}
이전 코드에 비해 두 개의 BraodcastReceiver가 추가되어 문자 메시지를 성공적으로 보내고 상대방이 받은 방송을 수신한다.여기에는 두 개의 암시적 Intent를 사용하여 브로드캐스트됩니다.Intent 및 암시적 Intent 표시 정보는 뒷글에서 설명합니다.위 코드가 보낸 문자는 시스템의 문자 라이브러리에서 찾을 수 없는 것으로 시스템의 문자 라이브러리에 기록되지 않았기 때문이다.시스템의 문자 라이브러리에 어떻게 쓰는지 뒤의 문자 내용 조작은 상세하게 소개할 것이다.
소개를 마치고 문자를 보낸 후 이어서 문자를 받는 것을 소개합니다.문자 수신은 문자 발송보다 훨씬 간단하다.안드로이드 시스템은 문자를 받은 후android를 방송합니다.provider.Telephony.SMS_RECEIVED 메시지, 문자를 받으면 이 메시지를 받고 문자의 내용을 표시하면 됩니다.
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
StringBuilder sb = new StringBuilder();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sb.append(buildContentFromSmsMessage(msgs[i])).append("
");
}
Toast.makeText(context, sb.toString(), Toast.LENGTH_SHORT).show();
}
}
private String buildContentFromSmsMessage(SmsMessage smsMsg) {
return smsMsg.getOriginatingAddress() + " : " + smsMsg.getMessageBody().toString();
}
}
코드에 나타난 pdus가 표시하는 여러 개의 PDU, PDU는 문자메시지의 데이터 형식(내부에 지령과 데이터 포함)으로wiki 문서를 구체적으로 보기http://en.wikipedia.org/wiki/Protocol_data_unit 동시에 안드로이드 미니페스트에서.xml 파일에 등록하기
<receiver android:name=".SMSReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
먼저 여기까지 쓰고 문자를 빨리 업데이트할게요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.