转载请注明出处: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,选择分享单张图片(如图三)我们继续选择我们自己的应用程序来显示(如图四),新建一个备忘录保存,长按备忘录进行分享(如图五),分享文本文件的显示界面(如图六)





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


更多相关文章

  1. Android(安卓)sharedUserId研究记录
  2. Android(安卓)之 Activity 生命周期
  3. Android应用程序及其主要结构
  4. Android应用屏幕适应问题的解决
  5. Android中常用的选择图像,跟换图像等(图像放大缩小等)
  6. android列表【android开发记录片】android下实现圆角列表布局控
  7. 运用smali自动注入技术分析android应用程序行为
  8. Android(安卓)SDK中 tools 目录下的工具介绍
  9. 3.5 意图Intent的概念

随机推荐

  1. Android(安卓)平台如何获取程序的版本
  2. Android震动代码解读
  3. android闹钟(三):实现时钟功能
  4. Android之Widget
  5. android 中对xml 进行解析
  6. android 禁止输入特殊字符
  7. Memory Analyzer(MAT)打开android eclipse
  8. android中菜单的使用
  9. Android(安卓)Re-installation failed解
  10. 【Android】SQLite数据库的简单使用