+1

Android Nhận Data Từ Ứng Dụng Khác Trong 2 Bước

Ứng dụng Android có thể chia sẻ data giữa các ứng dụng dễ dàng. Dữ liệu được chia sẻ bao gồm text, image, video , aduio file ..... Ví dụ bạn có thẻ chia sẻ một image từ ứng dụng Google Photo tới ứng dụng Facebook hoặc ứng dụng Instagram. Ngày nay nó là một tính năng phổ biến trong các ứng dụng social trên Android.

Để nhận data từ các ứng dụng khác, chúng ta cần phải coinfig Activity trong AndroidMainifest.xml và xử lý Intent chứa actiondata đã được gửi từ hệ thống. Thực hiện tính năng chia sẻ này chỉ cần 2 bước trong khoảng 10 phút. Tôi tìn rằng bạn sẽ tìm thấy điều thú vị và hữu ích trong bài viết ngắn này. Chúng ta hay bắt đầu!

Step 1. Add < Intent-filter> Trong AndroidManifest

<manifest>
  <application>
    <activity android:name="lequanghoa.apps.SharingActivity">
      
      <!-- Add below codes-->
      <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
        <!-- Or any of the below-->
        <!--<data android:mimeType="text/*" /> -->
        <!--<data android:mimeType="video/*" /> -->
      </intent-filter>
      
    </activity>
  </application>
</manifest>

Chúng ta add 4 tags tới Activity để xử lý data đang đến trong AndroidMainifest.xml . Chúng là:

  1. < intent-filter> Để nói rằng Activity này được áp dụng để xử lý hệ thống Intent với action và data được xác định tại các tag tương ứng là < action>< data> 2.< action> Định nghĩa IntentAction mà Activity này có thể xử lý. android.intent.action.SEND nhận về single data và android.intent.action.SENDMULTIPLE nhận về một list data. Trường action được sử dụng bởi hệ thống để lọc ra (filter) những ứng dụng mà sẵn sàng xử lý yêu cầu của Intent.
  2. < category> android.intent.category.DEFAULT phải được định nghĩa tại* < category>* nếu không thì Activity không thể nhận Intent không rõ dàng(implicit Intent) do đó không thể hiển thị tại dialog chia sẻ bên dưới.
  3. **< data> ** Khai báo type của MINE( (Multipurpose Internet Mail Extensions) để Activity này chú ý. Có một vài loại phổ biến:
  • text/ * cái này bao gồm text/plain, text/rtf, text/html, text/json
  • image/ * cái này bao gồm image/jpg, image/png, image/gif
  • video/ * cái này bao gồm video/mp4, video/3gp
  • audio/ * cái này bao gồm audio/wav
  • application/pdf * cái này bao gồm pdf file

Tại thời điểm này bạn có thể nhìn thấy icon ứng dụng của bạn suất hiện tại dialog sharing . Tiêu đề bôi đậm (bold) là tên ứng dụng và tiêu đề bên dưới là tên Activity được khai báo trong AndroidManifest.xml. Nhìn bên dưới:

<manifest>
  <!-- Bold title -->
  <application
    android:label="Demo app">
    
    <!-- Regular subtitle -->
    <activity
      android:label="Act label">
      
    </activity>
  </application>
</manifest>

Step 2 Xử Lý Data Tại Activity

class SharingActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_sharing)
    
    val isActivityLaunchedFromActionSend = intent?.action == Intent.ACTION_SEND
    val isActivityLaunchedFromActionSendMultiple = intent?.action == Intent.ACTION_SEND_MULTIPLE
    val isTextData = intent.type?.startsWith("text/") == true
    val isImageData = intent.type?.startsWith("image/") == true
    if (isActivityLaunchedFromActionSend && isTextData) {
      
      // Session 1: Handle received text data
      val sentString = intent.getStringExtra(Intent.EXTRA_TEXT)
      fooTextView.text = sentString
      
    } else if (isActivityLaunchedFromActionSend && isImageData) {
      
      // Session 2: Handle received image data
      val sentImageURI = intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri
      fooImageView.setImageURI(sentImageURI)
      
    } else if (isActivityLaunchedFromActionSendMultiple && isImageData) {
      
      // Session 3: Handle received multiple image data
      // Example of receiving 3 image URIs.
      val imageURIList = intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM) ?: arrayListOf()
      fooImageView.setImageURI(imageURIList.get(0) as? Uri)
      fooImageView2.setImageURI(imageURIList.get(1) as? Uri)
      fooImageView3.setImageURI(imageURIList.get(2) as? Uri)
      
    }
  }
}

Sau khi click vào icon app tại dialog sharing, Activity được xác định của bạn sẽ chạy và được khởi tạo. Data đã được gửi (ví dụ text, image, videok audio URI...) có thể được lấy về từ Intent đang tới tại onCreate() với các gía trị key khác nhau. Trước khi tất cả bắt đầu, line (7-8) trong đoạn code trên là cần thiết để xác định rằng Intent được gửi đến từ ACTIONSEND or ACTIONSENDMULTIPLE Ngoài ra data mine type cũng lên được được kiểm tra để đảm bảo rằng đúng keyfunction được sử dụng sau để lấy về data đã được gửi

Tại line 14-15 text đã gửi có thể được lấy về từ key Intent.EXTRATEXT

val sentString = intent.getStringExtra(Intent.EXTRA_TEXT)
fooTextView.text = sentString

Tại line 20-21 URI của image đã gửi có thể được lấy về từ key Intent.EXTRASTREAM

val sentImageURI = intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri
fooImageView.setImageURI(sentImageURI)

Tại line 20-21 URI của nhiều image đã gửi có thể được lấy về từ key Intent.EXTRASTREAM nhưng với 1 function khác getParcelableArrayListExtra(key: String)

val imageURIList = intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM) ?: arrayListOf()
fooImageView.setImageURI(imageURIList.get(0) as? Uri)
fooImageView2.setImageURI(imageURIList.get(1) as? Uri)
fooImageView3.setImageURI(imageURIList.get(2) as? Uri)

Summary

  1. Activity phải được khai báo với < intent-filter> để nói với hệ thống rằng Activity này có thể xử lý nhưng Intent nhất định với action và data được xác định tại các tag < action> và < data>
  2. android.intent.action.SEND or android.intent.action.SENDMULTIPLE lên được khai báo tại tag < action> để nhận data từ các app khác.
  3. android.intent.category.DEFAULT phải được định nghĩa tại tag < category> để hiển thị app tại dialog sharing
  4. MINE type được khai báo tại tag < data> để nói với hệ thống loại data nào mà Activity này có thể xử lý ví dụ text/, image/......
  5. Cả IntentActiondata type phải được kiểm tra tại callback* onCreate()* của Activity cụ thể. Intent.EXTRATEXT được xử lỵ để lấy về text và Intent.EXTRASTREAM được xử dụng để lấy về image đã gửi

Bài Viết Trên Được Tham Khảo Từ Nguồn: https://itnext.io/android-receiving-data-in-2-steps-21c49920172d


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í