之前给大家分享了你开发的应用程序给其他应用程序分享内容,想了解的朋友点击: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>
- 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,选择分享单张图片(如图三)我们继续选择我们自己的应用程序来显示(如图四),新建一个备忘录保存,长按备忘录进行分享(如图五),分享文本文件的显示界面(如图六)
内容大概就是这样,睡觉去了如果你觉得这篇文章对你有点帮助,你就帮我顶顶,谢谢大家关注!