Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
La Kiến Vinh Với Android, có những cú pháp tin nhắn thay vì bắt người sử dụng cuối phải vào phần tin nhắn và soạn tin nhắn để gửi. Như vậy sẽ bất tiện nếu như sản phẩm của chúng ta là 1 sản phẩm đóng và muốn tạo điều kiện cho người sử dụng gửi 1 số tin nhắn với cú pháp cố định.

Giới thiệu

Có những sản phẩm cố định ta cần gửi nội dung tin nhắn và số điện thoại cố định như cú pháp đến tổng đài tại bên trong ứng dụng của chúng ta, điều này giúp cho trải nghiệm người dùng tốt hơn việc họ phải mở ứng dụng gửi tin nhắn của hệ điều hành và giúp cho nhà phát triển có thể dễ dàng hơn trong việc giảm thiểu sự thay đổi quyết định mua hàng của người dùng cuối.

Vấn đề là không phải lúc nào ta cũng có server và người dùng cuối có mạng, để giúp họ điều khiển thiết bị ta sẽ có nhiều lựa chọn hơn cho họ, và SMS hay cuộc gọi là 1 trong những tính năng giúp kích hoạt việc thanh toán hoặc kích hoạt 1 hệ thống này miễn là hệ thống đó có thể giao tiếp qua SMS.

Trong bài viết này, tôi không chịu trách nhiệm thiết kế phần nhận tin nhắn và kích hoạt hệ thống thanh toán hoặc tự động hóa, tôi chỉ viết về phần gửi tin nhắn và tạo ra cuộc gọi đến 1 số điện thoại định sẵn.

Tiền đề bài viết

Trong 1 ngày tôi đến cửa hàng bán thiết bị CNC và quen được 1 người bạn là chủ của cửa hàng chuyên về tự động hóa. Tôi và người bạn này có mong muốn hiểu biết hơn về ngành nghề của nhau, và trong 1 nhu cầu thiết kế là cần nhận 1 tin nhắn từ điện thoại thì chuỗi tự động đó sẽ tự vận hành. Sau khi giúp anh bạn này hiện thực được ứng dụng đó (đối với tầm nhìn của phần mềm nó thật đơn giản), nhưng dành cho các bạn ngoài ngành, nó sẽ là cản trở lớn cho việc hiện thực ý tưởng của các bạn.

Đối tượng hướng đến

Dành cho các nhà phát triển đã có nền tảng tốt với Android API.

Chuẩn bị môi trường và tạo project Android

Thực hiện cuộc gọi

Thực hiện cuộc gọi có thể bắt đầu từ Android API level 1.

Import các package cần thiết, trong trường hợp này sử dụng Intent, Uri, và Exception, cơ bản bạn quan tâm đến Intent và Uri.

import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;

Thực hiện cuộc gọi

private void call() {
	try {
		String phoneNumber = "0933310128";

		Intent it = new Intent(Intent.ACTION_CALL);
		it.setData(Uri.parse("tel:" + phoneNumber));
		startActivity(it);
	}
	catch (ActivityNotFoundException e) {
		// Exceptions
	}
}

Khi muốn sử dụng tính năng cuộc gọi, ứng dụng phải thông báo cho người sử dụng cuối rằng nó có sử dụng tính năng này, do đó ta thêm vào khai báo sử dụng tính năng này vào AndroidManifest.xml - <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="vn.stdio.smsdemo" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
	
    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

</manifest>

Gửi tin nhắn SMS

Gửi tin nhắn

Từ Android API level 4 đã hỗ trợ SmsManager

Import các package cần thiết cho việc gửi SMS

import android.telephony.SmsManager;

Ra lệnh gửi SMS với số điện thoại là phoneNumber (String) và tin nhắn message (String) muốn gửi

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);

Vấn đề bảo mật - khi muốn sử dụng tính năng này, bắt buộc ta phải thông báo cho người dùng cuối biết rằng ta sử dụng tính năng SMS của họ, bằng cách thêm vào AndroidManifest.xml của project, đặt dòng <uses-permission android:name="android.permission.SEND_SMS"/> ngoài thẻ application ví dụ

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="vn.stdio.smsdemo" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
	
    <uses-permission android:name="android.permission.SEND_SMS"/>

</manifest>

Nâng cao

Với code trên ta đã đủ để gửi 1 tin nhắn đến người dùng, nâng cao hơn ta có thể kiểm tra thêm trạng thái tin nhắn đã gửi như thế nào? Và người dùng đã nhận chưa (nhận như thế nào). Quay trở lại code gửi tin nhắn, ta thêm vào sentPI và deliveredPI là

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);

Code đầy đủ sẽ là

private void sendSMS(String phoneNumber, String message)
{
	String SENT			= "SMS_SENT";
	String DELIVERED	= "SMS_DELIVERED";

	PendingIntent sentPI		= PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
	PendingIntent deliveredPI	= PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

	//---when the SMS has been sent---
	registerReceiver(new BroadcastReceiver(){
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			switch (getResultCode())
			{
				case Activity.RESULT_OK:
					// SMS sent
					
					break;
				case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
					// SMS fail without reason
					
					break;
				case SmsManager.RESULT_ERROR_NO_SERVICE:
					// No service
					
					break;
				case SmsManager.RESULT_ERROR_NULL_PDU:
					// Null PDU
					
					break;
				case SmsManager.RESULT_ERROR_RADIO_OFF:
					// Radio off
					
					break;
			}
		}
	}, new IntentFilter(SENT));

	//---when the SMS has been delivered---
	registerReceiver(new BroadcastReceiver(){
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			switch (getResultCode())
			{
				case Activity.RESULT_OK:
					// SMS delivered"
					
					break;
				case Activity.RESULT_CANCELED:
					// SMS not delivered
					
					break;
			}
		}
	}, new IntentFilter(DELIVERED));

	SmsManager sms = SmsManager.getDefault();
	sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}

Lời kết

Tôi vẫn hy vọng có được sự liên ngành để ở đâu đó, những người có được ý tưởng liên kết từ vật lý, cơ khí đến hình thành ra linh kiện điện tử rồi đến phần cứng và phần mềm có thể chủ động tìm kiếm lẫn nhau trong STDIO này để tạo ra những sản phẩm mạnh hơn cho các bạn và cho xã hội, điều này sẽ giúp các bạn không nhất thiết phải có cơ hội làm việc tại các công ty chuyên tạo ra phần cứng và phần mềm mà các bạn có thể tự chủ động tạo ra cơ hội cho bản thân mình.

THẢO LUẬN
ĐÓNG