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

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

2015-03-30 14:41 399 查看
之前给大家分享了你开发的应用程序给其他应用程序分享内容,想了解的朋友点击: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 可以分享图片给其他应用  

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













转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息