+2

Một số Implicit Intent phổ biến trong Android

Giới thiệu

Một Intent (ý định) cho phép bạn có thể chạy một Activity ở ứng dụng khác bằng cách mô tả tác vụ mà bạn muốn thực hiện (Ví dụ như "xem bản đồ" hay "chụp một bức ảnh") trong đối tượng Intent. Loại Intent này được gọi là Implicit Intent (ý định không rõ ràng) vì nó không mô tả cụ thể ứng dụng nào để thực thi, nhưng thay vào đó thì nó mô tả hành động và cung cấp một số dữ liệu để có thể thực hiện được hành động đó.

Khi bạn gọi phương thức startActivity() hay startActivityForResult() và truyền một Implicit Intent, hệ thống sẽ giải quyết Intent này tới ứng dụng mà có thể xử lý Intent đó và chạy Activity tương ứng. Nếu có nhiều hơn một ứng dụng có thể xử lý intent trên, thì hệ thống sẽ hiển thị một hộp thoại để người dùng có thể chọn sử dụng ứng dụng nào.

Sau đây là một số Implicit Intent hay được sử dụng để thực hiện một số tác vụ phổ biến khi lập trình ứng dụng Android, được sắp xếp bời loại ứng dụng mà xử lý Intent. Mỗi phần cũng thể hiện cách tạo Intent Filter (bộ lọc ý định) để thông báo rằng ứng dụng của bạn cũng có thể thực hiện hành động tương tự.

Lưu ý: Nếu không có ứng dụng nào trong thiết bị có thể nhận Implicit Intent, thì ứng dụng của bạn sẽ bị lỗi khi thực hiện startActivity(). Để có thể kiểm chứng trước rằng tồn tại một ứng dụng nào đó có thể nhận Intent này, bạn hãy gọi resolveActivity() trên đối tượng Intent của bạn.

  • Nếu kết quả trả về khác null, đồng nghĩa với việc có ít nhất một ứng dụng có thể xử lý Intent và lúc này thì bạn có thể gọi startActivity() một cách an toàn.
  • Nếu kết quả trả về là null, bạn không nên sử dụng Intent này. Nếu có thể thì bạn nên thông báo cho người dùng biết, và chỉ ra hướng xử lý, đồng thời bạn nên tắt các tính năng liên quan đến Intent.

Nếu bạn còn chưa rõ cách tạo Intent hay Intent Filter thì có thể tham khảo ở link sau https://developer.android.com/guide/components/intents-filters.html

Camera

Chụp ảnh hay quay video

Để mở ứng dụng camera và nhận ảnh hay video kết quả, bạn cần sử dụng hành động ACTION_IMAGE_CAPTURE hoặc là ACTION_VIDEO_CAPTURE. Đồng thời bạn cũng cần định nghĩa URI của vị trí mà bạn muốn trong phần phụ chú EXTRA_OUTPUT để camera lưu ảnh hay video.

Action

  • ACTION_IMAGE_CAPTURE hoặc
  • ACTION_VIDEO_CATURE

Data URI Scheme

  • Không

MIME Type

  • Không

Extras

Khi mà ứng dụng camera thực hiện thành công và quay trở lại ứng dụng của bạn (ứng dụng của bạn nhận được callback onActivityResult()), bạn có thể truy cập vào ảnh hoặc video ở URI mà bạn đã định nghĩa với giá trị của EXTRA_OUTPUT.

Lưu ý: Khi bạn sử dụng ACTION_IMAGE_CAPTURE để chụp ảnh, camera sẽ trả về thêm một bản sao chất lượng thấp của ảnh đó trong kết quả của Intent, được lưu dưới dạng Bitmap ở trong trường phụ với tên "data".

Ví dụ về Intent:

static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri mLocationForPhotos;

public void capturePhoto(String targetFilename) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.withAppendedPath(mLocationForPhotos, targetFilename));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelable("data");
        // Do other work with full size photo saved in mLocationForPhotos
        ...
    }
}

Để có thêm thông tin về cách sử dụng Intent để chụp ảnh, bao gồm cả cách tạo một Uri hợp lệ cho vị trí lưu ảnh thì bạn có thể tham khảo

Ví dụ về Intent Filter:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Khi xử lý Intent này thì Activity của bạn nên kiểm tra phần phụ EXTRA_OUTPUT trong Intent tới, tiếp đó lưu ảnh hay video kết quả vào vị trí đó và gọi setResult() với một Intent đã được thêm bản sao giảm lược ở phần phụ có tên "data".

Email

Soạn một email với phần đính kèm tùy chọn

Để soạn một email, bạn có thể sử dụng một trong các hành động sau tùy thuộc vào bạn có cần đính kèm hay không, và thêm các thông tin cần thiết của email như là người nhận, chủ đề với các khóa của phần phụ như sau

Action

  • ACTION_SENDTO (khi không đính kèm) hoặc
  • ACTION_SEND (khi có một đính kèm) hoặc
  • ACTION_SEND_MULTIPLE (cho nhiều đính kèm)

Data URI Scheme

  • Không

MIME Type

  • "text/plain"
  • "/"

Extras

  • Intent.EXTRA_EMAIL Một mảng string chứa địa chỉ mail của tát cả người nhận "To".
  • Intent.EXTRA_CC Một mảng string chứa địa chỉ mail của tát cả người nhận "CC".
  • Intent.EXTRA_BCC Một mảng string chứa địa chỉ mail của tất cả người nhận "BCC".
  • Intent.EXTRA_SUBJECT Một string với chủ đề của mail.
  • Intent.EXTRA_TEXT Một string chứa nội dung của mail.
  • Intent.EXTRA_STREAM Một Uri chỉ tới tệp đính kèm. Nếu bạn sử dụng hành động ACTION_SEND_MULTIPLE, thì cái này cần được thay thế bằng một ArrayList có chứa nhiều đối tượng Uri.

Ví dụ Intent:

public void composeEmail(String[] addresses, String subject, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("*/*");
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Nếu bạn muốn chắc chắn rằng Intent được xử lý bởi chỉ những ứng dụng email (và không phải là ứng dụng nhắn tin hay mạng xã hội), thì bạn nên dùng hành động ACTION_SENDTO và thêm Data Scheme (kiểu dữ liệu) "mailto:". Ví dụ:

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ví dụ Intent Filter:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="*/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SENDTO" />
        <data android:scheme="mailto" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Maps

Hiển thị vị trí ở trên bản đồ

Để có thể mở bản đồ, sử dụng hành động ACTION_VIEW và mô tả thông tin vị trí ở trong dữ liệu của intent với một trong các kiểu sau.

Action

  • ACTION_VIEW

Data URI Scheme

  • geo:latitude,longitude Hiển thị bản đồ tại vị trí xác định bởi kinh độ và vĩ độ Ví dụ: "geo:47.6,-122.3"
  • geo:latitude,longitude?z=zoom Hiển thị bản đồ tại vị trí xác định bởi kinh độ và vĩ độ, với độ zoom cho trước. Mức độ zoom cấp 1 hiển thị toàn bộ Trái Đất với trung tâm là kinh độ và vĩ độ đã định nghĩa. Mức độ zoom cao nhất (nhìn gần nhất) là 23. Ví dụ: "geo:47.6,-122.3?z=11"
  • geo:0,0?q=lat,lng(label) Hiển thị bàn đồ tại vị trí đã cho với nhãn Ví dụ: "geo:0,0?q=34.99,-106.61(Treasure)"
  • geo:0,0?q=dia+diem Hiển thị vị trí cho "dia diem" (có thể là địa chỉ chính xác hoặc là một truy vấn tìm kiếm địa chỉ) Ví dụ "geo:0,0?q=Ha+Noi+Viet+Nam" Lưu ý: Toán bộ chuỗi truyền vào geo URI cần phải được mã hóa. Ví dụ, chuỗi "Ha Noi" cần mã hóa thành "Ha+Noi". Các khoảng trắng trong chuỗi có thể mã hóa thành %20 hoặc kí tự +

MIME Type

  • Không

Ví dụ Intent:

public void showMap(Uri geoLocation) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(geoLocation);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ví dụ Intent Filter:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="geo" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Phone

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

Để có thể mở ứng dụng điện thoại và gọi tới một số cho trước, sử dụng hành động ACTION_DIAL và mô tả số điện thoại bằng cách sử dụng kiểu URI như sau. Khi mà ứng dụng điện thoại được mở ra, nó sẽ hiển thị số điện thoại đã được định nghĩa ở ô số, người dùng cần phải nhấn nút gọi để bắt đầu gọi điện.

Để có thể thực hiện cuộc gọi trực tiếp thì sử dụng hành động ACTION_CALL, khi mà ứng dụng điện thoại được mở ra thì nó sẽ thực hiện gọi trức tiếp tới số điện thoại đã được định nghĩa mà người dùng KHÔNG cần phải nhấn nút gọi để bắt đầu gọi điện.

Hành động ACTION_CALL yêu cầu bạn cần có quyền CALL_PHONE ở trong file manifest.

<uses-permission android:name="android.permission.CALL_PHONE" />

Action

  • ACTION_DIAL - Mở ứng dụng gọi điện
  • ACTION_CALL - Gọi trực tiếp đến số điện thoại (yêu cầu quyền CALL_PHONE)

Data URI Scheme

  • tel:

  • voicemail:<phone-number>

MIME Type

  • Không

Số điện thoại hợp lệ được định nghĩa trong IETF RFC 3966. Các ví dụ sau là hợp lệ

  • tel:2125551212
  • tel:(212) 555 1212

Ví dụ Intent:

public void dialPhoneNumber(String phoneNumber) {
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:" + phoneNumber));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Text Messaging

Soạn một tin nhắn SMS/MMS với đính kèm

Để gửi một tin nhắn SMS hay MMS, sử dụng một trong các hành động sau cho intent và định nghĩa nội dung chi tiết của tin nhắn bao gồm số điện thoại, chủ đề, nội dung tin nhắn bằng những khóa sau.

Action

  • ACTION_SENTO hoặc
  • ACTION_SEND hoặc
  • ACTION_SEND_MULTIPLE

Data URI Scheme

  • sms:<phone_number>
  • smsto:<phone_number>
  • mms:<phone_number>
  • mmsto:<phone_number>

MME Type

  • "text/plain"
  • "image/*"
  • "video/*"

Extras

  • "subject" Chủ đề của tin nhắn (chỉ dùng cho MMS).
  • "sms_body" Nội dung tin nhắn.
  • EXTRA_STREAM Một Uri trỏ tới hình ảnh hoặc video được đính kèm. Nếu bạn dùng hành động **ACTION_SEND_MULTIPLE **, thì phần thêm này cần là một ArrayList các Uri trỏ tới nhiều hình ảnh và nhiều video được đính kèm.

Ví dụ Intent:

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setType(HTTP.PLAIN_TEXT_TYPE);
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Nếu bạn muốn chắc chắn rằng chỉ có ứng dụng nhắn tin xử lý intent (mà không bao gồm các ứng dụng email hay xã hội khác), thì cần dùng hành động ACTION_SENDTO và thêm kiểu dữ liệu "smsto:". Ví dụ

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setData(Uri.parse("smsto:"));  // This ensures only SMS apps respond
    intent.putExtra("sms_body", message);
    intent.putExtra(Intent.EXTRA_STREAM, attachment);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ví dụ Intent Filter:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="text/plain" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Web Brower

Mở web URL

Để có thể mở một trang web, sử dụng hành động ACTION_VIEW và nêu rõ web URL ở trong dữ liệu intent

Action

  • ACTION_VIEW

Data URI Schême

  • http:<URL>
  • https:<URL>

MIME Type

  • "text/plain"
  • "text/html"
  • "application/xhtml+xml"
  • "application/vnd.wap.xhtml+xml"

Ví dụ Intent:

public void openWebPage(String url) {
    Uri webpage = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Ví dụ Intent Filter:

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <!-- Include the host attribute if you want your app to respond
             only to URLs with your app's domain. -->
        <data android:scheme="http" android:host="www.example.com" />
        <category android:name="android.intent.category.DEFAULT" />
        <!-- The BROWSABLE category is required to get links from web pages. -->
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
</activity>

Mẹo: Nếu ứng dụng Android của bạn cung cấp tính năng giống như là một trang web, bao gồm cả Intent Filter cho các URL mà chỉ tới trang web đó. Thì nếu người dùng đã cài đặt ứng dụng của bạn, các đường dẫn từ email hoặc trang web trỏ đến trang web của bạn sẽ mở ứng dụng Android thay vì mở trang web đó ra.

Bài dịch từ Common Intents - Android Developer https://developer.android.com/guide/components/intents-common.html#AdbIntents Ngoài ra còn nhiều Intent khác mà các bạn có thể tham khảo thêm trong link trên.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí