您的位置:首页 > 移动开发 > Android开发

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

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

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

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

[html] view
plaincopy





<?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如下

[java] view
plaincopy





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 可以分享图片给其他应用

//这里可以参考/article/1387335.html

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













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

转自:/article/1645800.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: