先来说说分享,毕竟没有分享何来接收分享可谈?

分享目前已实现的有两种方式:后台代码实现、ShareActionProvider实现,接着先说通过代码实现

  1. Intent intent=new Intent(Intent.ACTION_SEND);
  2. intent.setType("image/*");
  3. intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("/storage/emulated/0/Pictures/145.jpg"));
  4. startActivity(Intent.createChooser(intent,"share this image to..."));

这里分享的是图片,图片以二进制的形式进行传递,所以用Intent.EXTRA_STREAM来标志附加的消息类型。

如果是文字的话原理是一样的,只需将Type和附加信息改成如下即可

  1. intent.setType("text/plain");
  2. intent.putExtra(Intent.EXTRA_TEXT,"hello world");

这们就简单实现了内容分享,点击要分享的内容系统就会自动帮我们寻找实现了接收内容的程序(微信、QQ、蓝牙等),并展示出来让我们选择,如下图

那用ShareActionProvider如何实现的呢,首先在菜单文件里添加一个item

  1. <item android:id="@+id/share"
  2. android:orderInCategory="200"
  3. android:title="share"
  4. android:icon="@android:drawable/ic_menu_share"
  5. app:showAsAction="always"
  6. app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

这里使用的是v7包下的ShareActionProvider,对应的后台代码里面也要用v7包下的类,需要注意的是app:actionProviderClass的前缀是app而不是android,如果写成android会报错并闪退。如果一切正常那么程序启动后应付在标题栏显示一个分享的图片,额,确切的说是图标,点击的后也会展示出能内容的程序,如下图

添加完毕在后台的代码里面也要设置要分享的内容的,不然程序怎么知道要分享什么呢

  1. public boolean onCreateOptionsMenu(Menu menu) {
  2. getMenuInflater().inflate(R.menu.menu_main, menu);
  3.  
  4. MenuItem item=menu.findItem(R.id.share);
  5. ShareActionProvider sap= (ShareActionProvider) MenuItemCompat.getActionProvider(item);
  6. Intent intent=new Intent(Intent.ACTION_SEND);
  7. intent.setType("text/plain");
  8. intent.putExtra(Intent.EXTRA_TEXT,"hi jiujie zhu,do u have lunch?");
  9. if(sap!=null){
  10. sap.setShareIntent(intent);
  11. }
  12. return true;
  13. }

这里分享的是文本信息。

分享完毕就要接收,再来说说如何接收

接收其实挺简单的,至少比我想的简单(我是新手我自豪,咩嘿嘿~~~)

以接收图片为例,新建一个Activity,在清单文件里面设置action、data、category即可,怎么跟接收器有点像呢,看代码

  1. <intent-filter>
  2. <action android:name="android.intent.action.SEND"/>
  3. <category android:name="android.intent.category.DEFAULT"/>
  4. <data android:mimeType="image/*"/>
  5. </intent-filter>

data表示接收的文件类型,如果是文本类型的是不会接收的。这样进行标注后再分享内容时系统就会识别咱们的程序并展示给用户选择了,请看第二张图里面的ReceiveSharedContentAcitvity,这个就是自定义的接收内容的Activity,就这么简单啊。

光能接收并没用,关键是如何获取分享的内容和如何处理接收到的内容

  1. private void handleImage(){
  2. Intent intent=getIntent();
  3. String action=intent.getAction();
  4. String type=intent.getType();
  5. if(action.equals(Intent.ACTION_SEND)&&type.equals("image/*")){
  6. Uri uri=intent.getParcelableExtra(Intent.EXTRA_STREAM);
  7. //接收多张图片
  8.        //ArrayList<Uri> uris=intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
  9. if(uri!=null ){
  10. try {
  11. FileInputStream fileInputStream=new FileInputStream(uri.getPath());
  12. Bitmap bitmap= BitmapFactory.decodeStream(fileInputStream);
  13. imageView.setImageBitmap(bitmap);
  14. } catch (FileNotFoundException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }
  19. }

通过getIntent方法获取到包含分享内容的Intent,然后就可以获取里面的内容了。这是说明一点的是如果你分享的图片是在sd卡的话,请给程序添加读取sd卡的权限,不然会显示permission denied

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

上面说的都是分享一条文本或图片,如果要多个呢,一样的!只需在分享时用ArratList进行封装就行了,对于接收者来说,需要把action改成

  1. <action android:name="android.intent.action.SEND_MULTIPLEND"/>

表示接收多个内容,在代码里面从Intent中获取内容时用getParcelableArrayListExtra而不是getParcelableExtra。

Android分享内容和接收分享内容小小实现的更多相关文章

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

    Receiving Content from Other Apps[从其他app接收分享的内容] 就像你的程序能够发送数据到其他程序一样,其他程序也能够简单的接收发送过来的数据.需要考虑的是用户与你的 ...

  2. Android中实现APP文本内容的分享发送与接收方法简述

    谨记(指定选择器Intent.createChooser()) 开始今天的内容前,先闲聊一下: (1)突然有一天头脑风暴,对很多问题有了新的看法和见解,迫不及待的想要分享给大家,文档已经写好了,我需要 ...

  3. php框架tp3.2.3和js写的微信分享功能心得,分享的标题内容图片自定义

    https://blog.csdn.net/weixin_42231483/article/details/81585322 最近用PHP的tp3.2.3框架和js写的微信分享功能心得,分享的标题内容 ...

  4. 利用 Android 系统原生 API 实现分享功能

    利用 Android 系统原生 API 实现分享功能 这篇文章提供一个封装好的 Share2 库供大家参考. GitHub 项目地址:Share2 大家知道,要调用 Android 系统内建的分享功能 ...

  5. 【Android】安卓四大组件之内容提供者

    [Android]安卓四大组件之内容提供者 1.关于内容提供者 1.1 什么是内容提供者 内容提供者就是contentProvider,作用有如下: 给多个应用提供数据 类似一个接口 可以和多个应用分 ...

  6. Android应用中实现系统“分享”接口

    在android下各种文件管理器中,我们选择一个文件,点击分享可以看到弹出一些app供我们选择,这个是android系统分享功能,我们做的app也可以出现在这个列表中. 第一步:在Manifest.x ...

  7. android 微信朋友分享,朋友圈分享

    android 微信朋友分享,朋友圈分享 包名必须写成  com.weixin WXEntryActivity package com.weixin.wxapi; import android.app ...

  8. Android调用微信登陆、分享、支付

    前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...

  9. android 学习随笔二十一(内容提供者 )

    一.内容提供者* 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的私有数据* 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查 ...

随机推荐

  1. ADC采样间隔问题+TRGO作为ADC的触发源头

    为了控制采样时间,可以使用一个定时器的TRGO(定时器里每次发生更新事件时会有这个信号产生)作为定时器的外部触发. 从定时器框图可以看出,TRGO为TIMx的一个输出.不过这个输出是内部使用的. vo ...

  2. Linux 进程通信方式

    转载文章 进程通信的方式 管道( pipe ): 管道包括三种: 普通管道PIPE: 通常有两种限制,一是单工,只能单向传输;二是只能在父子或者兄弟进程间使用. 流管道s_pipe: 去除了第一种限制 ...

  3. 真机调试adb:wait for device 解决方案

    1.adb logcat 命令的时候,cmd总是提示adb server did't ACK.       分析一下,明显adb server没有开启成功,服务启动失败一般都是端口绑定失败,所以我们只 ...

  4. 【python深入】collections-Counter使用总结

    关于collections的使用,首先介绍:Counter的使用 需要执行:from collections import Counter 在很多使用到dict和次数的场景下,Python中用Coun ...

  5. flask 未完待续

    Flask - 一个短小精悍.可扩展的一个Web框架很多可用的第三方组件:http://flask.pocoo.org/extensions/blogs:https://www.cnblogs.com ...

  6. Linux下所有命令失效的解决方法

    今天在设置环境变量时,一不小心,设置错了,系统中的所有命令全部失效了,可把我急坏了,下面用一条命令可解决: 解决办法:重新设置环境变量PATH export PATH=/usr/sbin:/usr/b ...

  7. NFS服务简介与配置

    NFS简介 NFS特点 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源 在NFS的应用中, ...

  8. PAT 1088 三人行 模拟,坑 C

    PAT 1088 三人行 https://pintia.cn/problem-sets/994805260223102976/problems/1038429286185074688 题目: 子曰:“ ...

  9. JavaScript基础视频教程总结(041-050章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  10. python_day1_变量

    一.变量 定义: 通俗来讲可变化的量称之为变量,专业的解释为:把程序运算的中间结果临时存到内存里,以备后面的代码继续调用,这几个名字的学名就叫做“变量” 用法: name = 'zzx' 其中name ...