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一样简单,或者更难一些像在一张图片上添加一个有趣的滤镜。由你的程序来决定接下来会发生什么。