安卓系统自带分享(发送文本、图片)功能

摘自:http://blog.csdn.net/wqjsir/article/details/25538841


发送文本内容

   Android中使用ACTION_SEND最常用和最简单就是发送文本内容从一个Activity到另一个。例如,内嵌的浏览器可以分享当前呈现的页面的URL,作为一个文本内容和其他程序共享。
例如:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Intent sendIntent = new Intent();  
  2. sendIntent.setAction(Intent.ACTION_SEND);  
  3. sendIntent.putExtra(Intent.EXTRA_TEXT,"This is my text to send.");  
  4. sendIntent.setType("text/plain");  
  5. startActivity(sendIntent);  
     如果安装程序有的过滤器匹配上了ACTION_SEND 并且MIME type 为 text/plain,则该Adroid应用就会启动运行起来,如果系统中有多个应用程序的过滤器接受该过滤条件,则系统就会呈现一个选择器对话框。让用户选择需要运行的程序。如下图,在我的手机中分享一张图片时弹出的选择应用对话框:

  如果调用了Intent.createChooser()方法,则会android会总是呈现选择器,这样有以下影响:
  • 即使用户之前为该intent选择了一个默认的处理程序,选择器对话框也会呈现。
  • 如果没有应用程序匹配intent的过滤器,android则会呈现一个系统消息。
  • 你可以为该选择器指定一个标题。
下面为修改后的代码:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Intent sendIntent = new Intent();  
  2.  sendIntent.setAction(Intent.ACTION_SEND);  
  3.  sendIntent.putExtra(Intent.EXTRA_TEXT,"This is my text to send.");  
  4.  sendIntent.setType("text/plain");  
  5.  startActivity(Intent.createChooser(sendIntent,getResources().getText(R.string.send_to)));  
效果图如下:

发送二进制内容

    二进制数据可以通过ACTION_SEND事件来共享,同时要设置适当的MINE类型,将URI命名Intent.EXTRA_STREAM类型的数据。 通常二进制的分享,用于图片,同时也应用于所有二进制数据的分享。
例如:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Intent shareIntent = new Inent();  
  2.  shareIntent.setAction(Intent.ACTION_SEND);  
  3.  shareIntent.putExtra(Intent.EXTRA_STREAM,uriToImage);  
  4.  shareIntent.setType("image/jpeg");  
  5.  startActivity(Intent.createChooser(shareIntent,getResources().getText(R.string.send_to)));  
注意事项:
  • 你可以设置MIME type为“*/*”,但是这只会被那些能处理通用数据流的Activity匹配。
  • 接收intent的应用程序必须具有接入URI所指定的数据的权限。这里有一些方法可以获取这些许可:
    • 将数据写入所有APP可读的外部/共享存储设备上,通过Uri.formFile()来创建可以被分享的intent通过的URI。然而,不是所有的应用程序都会生成类型为 file:// 的 Uri。
    • 通过方法使用模型为MODE_WORLD_READABLE的openFileOutput() 将数据写入到应用程序的内部文件夹中的文件中。Uri.formFile()将会创建一个file:// 类型的Uri来分享你的intent.
    • 可以通过调用方法scanFile()来扫描images、videos、audio文件,并添加到系统的MediaStore中去。回调方法onScanCompleted()返回一个 content://类型的Uri
    • 可以通过insertImage()方法来向系统MediaStore中插入images,该方法会返回一个content:// 类型的Uri。注意,一旦添加到系统MediaStore设备上的任何应用程序都可以访问内容。
    • 将你的数据存储到自己的ContentProvider中,并且要确保其他Apps正确拥有访问该provider的权限。

发送多个内容

   要发送多部分的内容,应使用ACTION_SEND_MULTIPLE类型ACTION,并指定一系列的指向内容的URI。发送相同MINE类型的数据时指定同一MINE类型,发送多多种类型的图片时,使用“image/*”指定MINE 类型。如果发送不同种类的数据时应使用"*/*".例如:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ArrayList<Uri> imageUris = new ArrayList<Uri>();  
  2. imageUris.add(imageUri1);   
  3. imageUris.add(imageUri2);  
  4.         
  5. Intent shareIntent = new Intent();  
  6. shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);  
  7. shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,imageUris);  
  8. shareIntent.setType("image/*");  
  9. startActivity(Intent.createChooser(shareIntent,"Share images to..."));  

从其他Apps中接收内容

  通过定义intent过滤器来接收需要的intent数据。例如:
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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>  
这里我们定义了三个过滤器:
第一个我们过滤出action为SEND且MineType为image/*的intent数据;
第二个我们过滤出action为SEND且mineType为text/plain的intent数据;
第三个我们过滤出mineType为action为SEND_MAULTIPLE且minetype为image/*的inten数据。
当其他应用程序要分享intent时,并调用了startActivity()方法,Android系统将会列出intent选择器,如果用户选择了你的应用程序,则相应的Activity会启动。

处理接收到的intent数据

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public void onCreate(Bundle savedInstanceState) {  
  3.   super.onCreate(savedInstanceState);  
  4.   Intent intent = getIntent();  
  5.   String action = intent.getAction();  
  6.   String type = intent.getType();  
  7.   if (Intent.ACTION_SEND.equals(action)) {  
  8.     if ("text/plain".equals(type)) {  
  9.     handleSendText(intent);  
  10.      } else if (type.startsWith("image/")) {  
  11.     handleSendImage(intent);  
  12.      }  
  13.   } else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) {  
  14.      if (type.startsWith("image/")) {  
  15.     handleSendMultipleImages(intent);// 处理多个image文件的发送  
  16.       }  
  17.   } else {    
  18.      // 其他类型的ACTION  
  19.    }  
  20. }  
  21. public void handleSendText(Intent intent) {  
  22.    String shareText = intent.getStringExtra(Intent.EXTRA_TEXT);  
  23.    if (shareText != null) {  
  24.       //处理获接收到的文本  
  25.    }  
  26. }  
  27. public void handleSendImage(Intent intent) {  
  28.    Uri imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);  
  29.    if (imageUri != null) {  
  30.    //处理接收到的图片  
  31.    }  
  32. }  
  33. public void handleSendMultipleImages(Intent intent) {  
  34.    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);  
  35.    if (imageUris != null) {  
  36.      //处理接收到的图片  
  37.    }  
  38. }  
注意:
  特别的注意检查接收到的数据,因为,你不知道其他应用程序会发送什么数据。比如,错误的MIME type设置,或者发送的图片额外的大。同时,应该注意,在处理二进制数据时,应当在一另外一个线程中去处理,而不是在主UI的线程去处理。

添加分享菜单

  在我们的Activity中要添加分享菜单,这里我们在menu文件夹下新建一个share_menu.xml文件并添加分享的item,如下:
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  2.     <item  
  3.             android:id="@+id/menu_item_share"  
  4.             android:showAsAction="ifRoom"  
  5.             android:title="Share"  
  6.             android:actionProviderClass=  
  7.                 "android.widget.ShareActionProvider" />  
  8. </menu>  
    这里通过android:actionProviderClass类指定了分享菜单的支持类为android.widget.ShareActionProvider
这样我们就可以在我们的Activtiy中看到设置的分享菜单了:如下图:

   此时分享菜单不能点击(为禁用状态),这是因为我们还没有设置分享的数据,所以为仅用状态。在我们的Activity中我们通过下面的方法来设置分享数据
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private ShareActionProvider mShareActionProvider;  
  2. ....  
  3. @Override  
  4. public boolean onCreateOptionsMenu(Menu menu) {  
  5.    getMenuInflater().inflate(R.menu.share_menu, menu);  
  6.    MenuItem item = menu.findItem(R.id.menu_item_share);  
  7.    //找到分享菜单的支持类对象  
  8.    mShareActionProvider  = (ShareActionProvider) item.getActionProvider();  
  9.    return true;  
  10. }  
  11. //这里来设置share的数据,设置后share菜单将可用  
  12. private void setShareIntent(Intent shareIntent) {  
  13.    if (mShareActionProvider != null) {  
  14.       mShareActionProvider.setShareIntent(shareIntent);  
  15.    }  
  16. }  
    如上面在构建好需要分享的itent后调用setShareIntent方法,将intent设置到分享菜单的类提供者上。此时分享菜单就可用,我们点击后就可以分享我们intent中指定的数据了。如图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值