Android学习笔记(十九)分享简单数据

来源:互联网 发布:linux write函数 编辑:程序博客网 时间:2024/05/07 07:01

发送文本内容

   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. }  
<span class="pun" style="background-color: inherit;"><span style="background-color: inherit;"><span style="font-family: KaiTi_GB2312; font-size: 18px;">注意:</span></span></span>
<span class="pun" style="background-color: inherit;"><span style="font-family: KaiTi_GB2312; font-size: 18px;">  特别的注意检查接收到的数据,因为,你不知道其他应用程序会发送什么数据。比如,错误的MIME type设置,或者发送的图片额外的大。同时,应该注意,在处理二进制数据时,应当在一另外一个线程中去处理,而不是在主UI的线程去处理。</span></span>

添加分享菜单

<span class="pun" style="background-color: inherit;"><span style="background-color: inherit;"><span style="font-family: KaiTi_GB2312; font-size: 18px;">  在我们的Activity中要添加分享菜单,这里我们在menu文件夹下新建一个share_menu.xml文件并添加分享的item,如下:</span></span></span>
[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>  
<span style="color: rgb(38, 38, 38); background-color: inherit;"><span style="font-family: KaiTi_GB2312; font-size: 18px;"><span class="pun" style="background-color: inherit;"><span style="background-color: inherit;">    这里通过android:actionProviderClass类指定了分享菜单的支持类为</span></span><span style="background-color: rgb(247, 247, 247);">android.widget.ShareActionProvider</span></span></span>
<span style="background-color: inherit;"><span style="color: rgb(38, 38, 38); background-color: inherit;"><span style="font-family: KaiTi_GB2312; font-size: 18px;">这样我们就可以在我们的Activtiy中看到设置的分享菜单了:如下图:</span></span></span>
<span style="background-color: inherit;"><span style="color: rgb(38, 38, 38); background-color: inherit;"><span style="font-family: KaiTi_GB2312; font-size: 18px;"><img src="http://img.blog.csdn.net/20140511120556468?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3Fqc2ly/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="350" height="200" alt="" style="border: none; max-width: 100%;" /></span></span></span>
<span style="color: rgb(38, 38, 38); background-color: inherit;"><span style="font-family: KaiTi_GB2312; font-size: 18px;">   此时分享菜单不能点击(为禁用状态),这是因为我们还没有设置分享的数据,所以为仅用状态。在我们的Activity中我们通过下面的方法来设置分享数据</span></span>
[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. }  
<span style="color: rgb(38, 38, 38); background-color: inherit;"><span style="font-family: KaiTi_GB2312; font-size: 18px;">    如上面在构建好需要分享的itent后调用setShareIntent方法,将intent设置到分享菜单的类提供者上。此时分享菜单就可用,我们点击后就可以分享我们intent中指定的数据了。如图:</span></span>

转载于http://blog.csdn.net/wqjsir/article/details/25538841

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝上买化妆品买到假货了怎么办 找苹果官网解id发票丢了怎么办 客人已交订金但要取消宴席怎么办 京东买的小米电视碎屏了怎么办 京东购买的电视碎屏了怎么办 淘宝上买手机不能用不给退怎么办 天猫申请退货退款卖家不处理怎么办 在淘宝买到货到付款的假苹果怎么办 跟朋友买手机买到假货怎么办 在淘宝网上买到不合格的产品怎么办 淘宝打假师打了我的店铺怎么办 收藏品公司关门跑路员工怎么办 客户快递签收后说货物短缺怎么办 京东商城买东西商家不换货怎么办 在商场买东西过几天就降价了怎么办 天猫买东西不退货不退款怎么办 买买8p美版的怎么办 京东金条银行卡被冻结还不了怎么办 在瑞士刚买的浪琴手表不走了怎么办 刚买的手表表镜有划痕 怎么办 唯品会上买的手表有质量问题怎么办 我买的对方材料没开票给我怎么办 给对方修完车车主不给发票怎么办 买苹果手机花呗额度不够怎么办 苹果手机用别人的手机卡激活怎么办 小米商城花呗分期额度不够怎么办 淘宝已经形成订单商家不发货怎么办 小米商城退款后又想买了怎么办 淘宝退货退款后不想退了怎么办 在转转的商品被屏了怎么办 不懂如何挑选适合自己的衣服怎么办 淘宝购买商品给顾客造成损失怎么办 微信购物地址写错了怎么办 微信购物后一直不发货怎么办 微信购物不发货也不退款怎么办 淘宝退货不小心点了确认收货怎么办 外卖不小心点了确认收货怎么办 圆通快递单号查不到物流信息怎么办 在京东买东西没收到退回去了怎么办 我的东西没收到退回去了怎么办 快递丢了快件丢失了快递公司怎么办