Android - 分享内容 - 接收其他APP的内容

就象程序可以发送数据给其他程序,所以也可以接收其他程序的数据。想一下用户如何和程序交互,以及想从其他程序接收什么样类型的数据。例如,一个社交程序可能对接收其他程序的文字(比如有趣的网址)感兴趣。Google+ 程序可接收文字和单多张图片。用这个app,用户可以和容易的用Android Gallery中的相片在Google+上发布。

更新Manifest

intent filter会告诉系统程序会打算接收什么。就和前面讲的如何用ACTION_SEND创建intent相似,创建intent filter来接收带有这个操作的intent。在manifest中用<intent-filter>元素来来定义一个intent filter。例如,如果程序可接收文字,任何类型的单张图片,或任何类型的多张图片,mainfest应该象:

 1 <activity android:name=".ui.MyActivity" >

 2     <intent-filter>

 3         <action android:name="android.intent.action.SEND" />

 4         <category android:name="android.intent.category.DEFAULT" />

 5         <data android:mimeType="image/*" />

 6     </intent-filter>

 7     <intent-filter>

 8         <action android:name="android.intent.action.SEND" />

 9         <category android:name="android.intent.category.DEFAULT" />

10         <data android:mimeType="text/plain" />

11     </intent-filter>

12     <intent-filter>

13         <action android:name="android.intent.action.SEND_MULTIPLE" />

14         <category android:name="android.intent.category.DEFAULT" />

15         <data android:mimeType="image/*" />

16     </intent-filter>

17 </activity>

注意:更多关于intent filters和intetent解决方案请参考Intents and Intent Fileters

当其他程序通过创建intent然后传递给startActivity()来分享上面的类容,你的程序会在intent chooser列表中显示,如果用户选择了你的程序,相应的activity(上面例子中的.ui.MyActivity)将会被启动。然后就由你来在代码和界面中来处理内容了。

处理传入的数据

要处理Intent传递的数据,首先调用getIntent()来获得Intent对象。一旦获得了这个对象,可以通过查看数据来决定接下来怎么做。记住如果activity可以从系统的其他部分启动,比如launcher,那么需要在查看intent的时候考虑这些情况。

 1 void onCreate (Bundle savedInstanceState) {

 2     ...

 3     // 获得 intent, action 和 MIME type

 4     Intent intent = getIntent();

 5     String action = intent.getAction();

 6     String type = intent.getType();

 7 

 8     if (Intent.ACTION_SEND.equals(action) && type != null) {

 9         if ("text/plain".equals(type)) {

10             handleSendText(intent); // 处理发送来的文字

11         } else if (type.startsWith("image/")) {

12             handleSendImage(intent); // 处理发送来的图片

13         }

14     } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {

15         if (type.startsWith("image/")) {

16             handleSendMultipleImages(intent); // 处理发送来的多张图片

17         }

18     } else {

19         // 处理其他intents,比如由主屏启动

20     }

21     ...

22 }

23 

24 void handleSendText(Intent intent) {

25     String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);

26     if (sharedText != null) {

27         // 根据分享的文字更新UI

28     }

29 }

30 

31 void handleSendImage(Intent intent) {

32     Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);

33     if (imageUri != null) {

34         // 根据分享的图片更新UI

35     }

36 }

37 

38 void handleSendMultipleImages(Intent intent) {

39     ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);

40     if (imageUris != null) {

41         // 根据分享的多张图片更新UI

42     }

43 }

注意:要格外小心的检查传入的数据,你不知道其他程序传进来什么。例如,有可能设置了错的MIME类型,或者图片可能非常大。还要记住,在另外一个线程中处理二进制数据,而不是UI线程。

更新UI可以是像填充EditText一样简单,或者更难一些像在一张图片上添加一个有趣的滤镜。由你的程序来决定接下来会发生什么。

 

上一篇:Android - 分享内容 - 给其他APP发送内容

下一篇:Android - 分享内容 - 添加一个简单的分享操作

你可能感兴趣的:(android)