转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613

Android 应用程序之间内容分享详解(一)

之前给大家分享了你开发的应用程序给其他应用程序分享内容,想了解的朋友点击:Android 应用程序之间内容分享详解(一)今天分享的是从其他的应用程序接收内容,比如你开发了一个社交网络的应用,你其中的某个Activity可以接受人们从其他的应用分享的东西,例如分享文字或者从图库分享图片等等,接下来我们利用一个例子来讲解从其他的应用接受内容

1.我们新建一个Android工程,名字为SharedContext,修改Manifest文件

我们需要在Manifest文件中定义这个Activity能接收什么样的Intent,我们需要创建Intent过滤器,使用 <intent-filter> 元素来过滤我们能接收的Intent,下面我们举个简单的例子,相信大家知道举一反三,下面的例子我们的应用程序可以处理文本,文本文件,单一的图片和多张图片,我们定义Manifest文件如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sharedcontext"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.sharedcontext.MainActivity"
android:label="@string/app_name" > <!-- 应用程序的启动 Intent,我们例子只有一个Activity-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter> <!-- 处理文字的Intent 我们需要定义action, category, 和文字对应的MIME -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
</intent-filter> <!-- 处理单张图片的Intent -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter> <!-- 处理多张图片的Intent -->
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
</application
</manifest>

当一个应用程序构建上面那样子的Intent,并吧它传递给StartActivity(),我们的应用程序就会被列在Intent选择器中,当用户选择该应用程序就进入相对应的Activity(上面的例子是MainActivity),我们只需要在MainActivity处理这样内容并用相对应的UI显示, MainActivity如下

package com.example.sharedcontext;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
//获得Intent的Action
String action = intent.getAction();
//获得Intent的MIME type
String type = intent.getType(); if(Intent.ACTION_SEND.equals(action) && type != null){
//我们这里处理所有的文本类型
if(type.startsWith("text/")){
//处理获取到的文本,这里我们用TextView显示
handleSendText(intent);
}
//图片的MIME type有 image/png , image/jepg, image/gif 等,
else if(type.startsWith("image/")){
//处理获取到图片,我们用ImageView显示
handleSendImage(intent);
}
}
else if(Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null){
if (type.startsWith("image/")) {
//处理多张图片,我们用一个GridView来显示
handleSendMultipleImages(intent);
}
}
} /**
* 用TextView显示文本
* 可以打开一般的文本文件
* @param intent
*/
private void handleSendText(Intent intent){
TextView textView = new TextView(this); //一般的文本处理,我们直接显示字符串
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if(sharedText != null){
textView.setText(sharedText);
} //文本文件处理,从Uri中获取输入流,然后将输入流转换成字符串
Uri textUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
if(textUri != null){
try {
InputStream inputStream = this.getContentResolver().openInputStream(textUri);
textView.setText(inputStream2Byte(inputStream));
} catch (Exception e) {
e.printStackTrace();
}
} //设置给Activity
setContentView(textView);
} /**
* 将输入流转换成字符串
* @param inputStream
* @return
* @throws IOException
*/
private String inputStream2Byte(InputStream inputStream) throws IOException{
ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte [] buffer = new byte[1024];
int len = -1; while((len = inputStream.read(buffer)) != -1){
bos.write(buffer, 0, len);
} bos.close(); //指定编码格式为UIT-8
return new String(bos.toByteArray(), "UTF-8");
} /**
* 用ImageView显示单张图片
* @param intent
*/
private void handleSendImage(Intent intent) {
Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (imageUri != null) {
ImageView imageView = new ImageView(this);
imageView.setImageURI(imageUri);
setContentView(imageView);
}
} /**
* 用GridView显示多张图片
* @param intent
*/
private void handleSendMultipleImages(Intent intent) {
final ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
if (imageUris != null) {
GridView gridView = new GridView(this);
//设置item的宽度
gridView.setColumnWidth(130);
//设置列为自动适应
gridView.setNumColumns(GridView.AUTO_FIT);
gridView.setAdapter(new GridAdapter(this, imageUris));
setContentView(gridView); gridView.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
final int position, long id) { //点击GridView的item 可以分享图片给其他应用
//这里可以参考http://blog.csdn.net/xiaanming/article/details/9395991
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, imageUris.get(position));
intent.setType("image/*");
startActivity(Intent.createChooser(intent, "共享图片"));
}
}); }
} /**
* 重写BaseAdapter
* @author xiaanming
*
*/
public class GridAdapter extends BaseAdapter{
private Context mContext;
private ArrayList<Uri> list; public GridAdapter(Context mContext, ArrayList<Uri> list){
this.list = list;
this.mContext = mContext;
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if(convertView == null){
imageView = new ImageView(mContext);
imageView.setPadding(8, 8, 8, 8);
}else{
imageView = (ImageView) convertView;
}
imageView.setImageURI(list.get(position));
return imageView;
}
}
}

运行程序之后,然后我们选择系统图库,选择多张图片(如图一)进行分享,我们自己的应用程序分享多张界面(如图二)点击我们应用程序的item,选择分享单张图片(如图三)我们继续选择我们自己的应用程序来显示(如图四),新建一个备忘录保存,长按备忘录进行分享(如图五),分享文本文件的显示界面(如图六)

内容大概就是这样,睡觉去了如果你觉得这篇文章对你有点帮助,你就帮我顶顶,谢谢大家关注!

Android 应用程序之间内容分享详解(二)的更多相关文章

  1. Android 应用程序之间内容分享详解(一)

    一个Andoird应用程序的重要的地方是他们有相互沟通和整合的能力,一个应用程序可以和另一个应用程序交互,接下来我们来看看Android应用之间的内容分享 当你构建Intent的时候,必须要指定Int ...

  2. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

  3. Android应用程序之间共享文字和图片(二)

    MainActivity如下: package cn.testshare1; import java.io.File; import java.util.ArrayList; import andro ...

  4. Android应用程序之间共享文字和图片(一)

    以下为TestReceiveShare1工程 MainActivity如下: package cn.testreceiveshare1; import java.util.ArrayList; imp ...

  5. Android EventBus 3.0 实例使用详解

    EventBus的使用和原理在网上有很多的博客了,其中泓洋大哥和启舰写的非常非常棒,我也是跟着他们的博客学会的EventBus,因为是第一次接触并使用EventBus,所以我写的更多是如何使用,源码解 ...

  6. Android 广播大全 Intent Action 事件详解

    Android 广播大全 Intent Action 事件详解 投稿:mrr 字体:[增加 减小] 类型:转载 时间:2015-10-20我要评论 这篇文章主要给大家介绍Android 广播大全 In ...

  7. JavaScript进阶内容——DOM详解

    JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...

  8. Android开发:文本控件详解——TextView(一)基本属性

    一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...

  9. [置顶] xamarin android toolbar(踩坑完全入门详解)

    网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...

随机推荐

  1. [USACO3.2]Sweet Butter

    题目大意: 给定一张$k$个结点,$m$条边的无向图,其中有$n$个点被标记,在这$k$个点中找出一个点使得这个点到那$n$个点的最短距离之和最小,求出这个距离和. 思路: 对于每个标记结点跑最短路, ...

  2. BZOJ4276 : [ONTAK2015]Bajtman i Okrągły Robin

    建立线段树, S向每个叶子连边,容量1,费用0. 孩子向父亲连边,容量inf,费用0. 每个强盗向T连边,容量1,费用为c[i]. 对应区间内的点向每个强盗,容量1,费用0. 求最大费用流即可. #i ...

  3. MySQL 集群

    MySQL Galera介绍 主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正的并行复制,行级 ...

  4. clientHeight ,offsetHeight,style.height,scrollHeight有区别与联系

    style.height 包括 元素的滚动条,不包括边框clientHeight 不包括元素的滚动条和边框,只有在没有元素的滚动条的情况下,style.height相等于clientHeightoff ...

  5. 关于eclipse的indigo版中文注释时字体太小的问题(转)

    eclipse目前最新版代号indigo, 在win7上使用时中文注释时字体太小的问题. 为什么会这样? 首先我们应该知道, 在win7系统中, font是有"显示"和" ...

  6. HDU 4453 Looploop (伸展树splay tree)

    Looploop Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. CVPR 2017

    https://www.leiphone.com/news/201707/5D5qSICrej6xIdzJ.html Densely Connected Convolutional Networks ...

  8. HP Notebook PCs - Updating the BIOS

    HP Notebook PCs - Updating the BIOS Updating the BIOS Updating the BIOS when Windows does not start ...

  9. 解决ubuntu上在androidstudio中启动emulator闪退的问题(2)

    平台 Ubuntu14.04 64 现象 在AndrodStudio中点击模拟器的启动按钮后,模拟器界面弹出后,又立刻闪退. 解决 一.查看模拟器的信息 从上面可以看到模拟器的存放路径以及名称: 路径 ...

  10. lodash用法系列(6),函数种种

    Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...