android 从其他app接收分享的内容

Receiving Content from Other Apps[从其他app接收分享的内容]

  • 就像你的程序能够发送数据到其他程序一样,其他程序也能够简单的接收发送过来的数据。需要考虑的是用户与你的程序如何进行交互,你想要从其他程序接收哪些数据类型。例如,一个社交网络程序会希望能够从其他程序接受文本数据,像一个有趣的网址链接。Google+的Android客户端会接受文本数据与单张或者多张图片。用这个app,用户可以简单的从Gallery程序选择一张图片来启动Google+进行发布。

Update Your Manifest[更新你的manifest文件]

  • Intent filters通知了Android系统说,一个程序会接受哪些数据。像上一课一样,你可以创建intent filters来表明程序能够接收哪些action。下面是个例子,对三个activit分别指定接受单张图片,文本与多张图片。【这里有不清楚Intent filter的,请参考Intents and Intent Filters
  1. <activityandroid:name=".ui.MyActivity">
  2. <intent-filter>
  3. <actionandroid:name="android.intent.action.SEND"/>
  4. <categoryandroid:name="android.intent.category.DEFAULT"/>
  5. <dataandroid:mimeType="image/*"/>
  6. </intent-filter>
  7. <intent-filter>
  8. <actionandroid:name="android.intent.action.SEND"/>
  9. <categoryandroid:name="android.intent.category.DEFAULT"/>
  10. <dataandroid:mimeType="text/plain"/>
  11. </intent-filter>
  12. <intent-filter>
  13. <actionandroid:name="android.intent.action.SEND_MULTIPLE"/>
  14. <categoryandroid:name="android.intent.category.DEFAULT"/>
  15. <dataandroid:mimeType="image/*"/>
  16. </intent-filter>
  17. </activity>
<activity android:name=".ui.MyActivity" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
  • 当另外一个程序尝试分享一些东西的时候,你的程序会被呈现在一个列表里面让用户进行选择。如果用户选择了你的程序,相应的activity就应该被调用开启,这个时候就是你如何处理获取到的数据的问题了。

Handle the Incoming Content[处理接受到的数据]

  • 为了处理从Intent带过来的数据,可以通过调用getIntent()方法来获取到Intent对象。一旦你拿到这个对象,你可以对里面的数据进行判断,从而决定下一步应该做什么。请记住,如果一个activity可以被其他的程序启动,你需要在检查intent的时候考虑这种情况(是被其他程序而调用启动的)。
  1. void onCreate (Bundle savedInstanceState) {
  2. ...
  3. // Get intent, action and MIME type
  4. Intent intent = getIntent();
  5. String action = intent.getAction();
  6. String type = intent.getType();
  7. if (Intent.ACTION_SEND.equals(action) && type != null) {
  8. if ("text/plain".equals(type)) {
  9. handleSendText(intent); // Handle text being sent
  10. } elseif (type.startsWith("image/")) {
  11. handleSendImage(intent); // Handle single image being sent
  12. }
  13. } elseif (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
  14. if (type.startsWith("image/")) {
  15. handleSendMultipleImages(intent); // Handle multiple images being sent
  16. }
  17. } else {
  18. // Handle other intents, such as being started from the home screen
  19. }
  20. ...
  21. }
  22. void handleSendText(Intent intent) {
  23. String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
  24. if (sharedText != null) {
  25. // Update UI to reflect text being shared
  26. }
  27. }
  28. void handleSendImage(Intent intent) {
  29. Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
  30. if (imageUri != null) {
  31. // Update UI to reflect image being shared
  32. }
  33. }
  34. void handleSendMultipleImages(Intent intent) {
  35. ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
  36. if (imageUris != null) {
  37. // Update UI to reflect multiple images being shared
  38. }
  39. }
void onCreate (Bundle savedInstanceState) {
...
// Get intent, action and MIME type
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) {
if ("text/plain".equals(type)) {
handleSendText(intent); // Handle text being sent
} else if (type.startsWith("image/")) {
handleSendImage(intent); // Handle single image being sent
}
} else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
if (type.startsWith("image/")) {
handleSendMultipleImages(intent); // Handle multiple images being sent
}
} else {
// Handle other intents, such as being started from the home screen
}
...
} void handleSendText(Intent intent) {
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText != null) {
// Update UI to reflect text being shared
}
} void handleSendImage(Intent intent) {
Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (imageUri != null) {
// Update UI to reflect image being shared
}
} void handleSendMultipleImages(Intent intent) {
ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
if (imageUris != null) {
// Update UI to reflect multiple images being shared
}
}
  • 请注意,因为你无法知道其他程序发送过来的数据内容是文本还是其他的数据,因此你需要避免在UI线程里面去处理那些获取到的数据。
  • 更新UI可以像更新EditText一样简单,也可以是更加复杂一点的操作,例如过滤出感兴趣的图片。It's really specific to your application what happens next.
 

学习自:http://developer.android.com/training/sharing/receive.html,请多指教,谢谢!

转载请注明出处:http://blog.csdn.net/kesenhoo,谢谢!
上一篇:8. 解密Python中列表的底层实现,通过源码分析列表支持的相关操作


下一篇:Base Enum Properties [AX 2012]