转载请注明出处: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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = getIntent();//获得Intent的ActionString action = intent.getAction();//获得Intent的MIME typeString 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-8return 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() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,final int position, long id) {//点击GridView的item 可以分享图片给其他应用//这里可以参考http://blog.csdn.net/xiaanming/article/details/9395991Intent 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;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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 应用程序之间内容分享详解(二)Android 应用程序之间内容分享详解(二)Android 应用程序之间内容分享详解(二)

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



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


更多相关文章

  1. Eclipse项目导入Android Studio,.9图片报错解决办法
  2. Android应用程序签名(官方文档中文版)
  3. Android架构分析之基于Android系统的C应用程序开发
  4. [原]Android应用程序消息处理机制(Looper、Handler)分析
  5. Android 图片缩放-Matrix
  6. 转:RTC搭建android下三层应用程序访问服务器MsSql-服务器端
  7. 老罗的Android之旅——Android应用程序的Activity启动过程简要介

随机推荐

  1. sencha touch 调用android主函数里的方法
  2. Xamarin Mono For Android 4.6.07004 完
  3. 运用Android ROM Manager应用安装Clockwo
  4. Android如何反编译与再编译
  5. Android Shape属性(内含一个Button完整的
  6. 关于如何检测Android的内存泄漏:
  7. Android之ListView属性描述
  8. android 使用mediaplayer播放网络音乐
  9. Android(安卓)多个APK共享数据(Shared Us
  10. listview为空时,显示字符串