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

大家好!很荣幸我能够成为CSDN 2013年度博客之星评选的候选人,希望继续得到大家的支持与鼓励,看到的朋友帮我投上宝贵的一票吧!

       投票地址:http://vote.blog.csdn.net/blogstaritem/blogstar2013/xiaanming


转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613

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


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

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

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

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.sharedcontext"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="16" />  
  10.     <application  
  11.         android:allowBackup="true"  
  12.         android:icon="@drawable/ic_launcher"  
  13.         android:label="@string/app_name"  
  14.         android:theme="@style/AppTheme" >  
  15.         <activity  
  16.             android:name="com.example.sharedcontext.MainActivity"  
  17.             android:label="@string/app_name" >  
  18.               
  19.             <!-- 应用程序的启动 Intent,我们例子只有一个Activity-->  
  20.             <intent-filter>  
  21.                 <action android:name="android.intent.action.MAIN" />  
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.   
  25.             <!-- 处理文字的Intent 我们需要定义action,  category, 和文字对应的MIME -->  
  26.             <intent-filter>  
  27.                 <action android:name="android.intent.action.SEND" />  
  28.                 <category android:name="android.intent.category.DEFAULT" />  
  29.                 <data android:mimeType="text/*" />  
  30.             </intent-filter>  
  31.   
  32.             <!-- 处理单张图片的Intent -->  
  33.             <intent-filter>  
  34.                 <action android:name="android.intent.action.SEND" />  
  35.                 <category android:name="android.intent.category.DEFAULT" />  
  36.                 <data android:mimeType="image/*" />  
  37.             </intent-filter>  
  38.   
  39.             <!-- 处理多张图片的Intent -->  
  40.             <intent-filter>  
  41.                 <action android:name="android.intent.action.SEND_MULTIPLE" />  
  42.                 <category android:name="android.intent.category.DEFAULT" />  
  43.                 <data android:mimeType="image/*" />  
  44.             </intent-filter>  
  45.         </activity>  
  46.     </application  
  47. </manifest>  
当一个应用程序构建上面那样子的Intent,并吧它传递给StartActivity(),我们的应用程序就会被列在Intent选择器中,当用户选择该应用程序就进入相对应的Activity(上面的例子是MainActivity),我们只需要在MainActivity处理这样内容并用相对应的UI显示, MainActivity如下

[java] view plain copy
  1. package com.example.sharedcontext;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.util.ArrayList;  
  7.   
  8. import android.app.Activity;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.net.Uri;  
  12. import android.os.Bundle;  
  13. import android.view.View;  
  14. import android.view.ViewGroup;  
  15. import android.widget.AdapterView;  
  16. import android.widget.AdapterView.OnItemClickListener;  
  17. import android.widget.BaseAdapter;  
  18. import android.widget.GridView;  
  19. import android.widget.ImageView;  
  20. import android.widget.TextView;  
  21.   
  22. public class MainActivity extends Activity {  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         Intent intent = getIntent();  
  28.         //获得Intent的Action  
  29.         String action = intent.getAction();  
  30.         //获得Intent的MIME type  
  31.         String type = intent.getType();  
  32.           
  33.           
  34.         if(Intent.ACTION_SEND.equals(action) && type != null){  
  35.             //我们这里处理所有的文本类型  
  36.             if(type.startsWith("text/")){  
  37.                 //处理获取到的文本,这里我们用TextView显示  
  38.                 handleSendText(intent);  
  39.             }  
  40.             //图片的MIME type有 image/png , image/jepg, image/gif 等,  
  41.             else if(type.startsWith("image/")){  
  42.                 //处理获取到图片,我们用ImageView显示  
  43.                 handleSendImage(intent);  
  44.             }  
  45.         }  
  46.         else if(Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null){  
  47.              if (type.startsWith("image/")) {  
  48.                     //处理多张图片,我们用一个GridView来显示  
  49.                     handleSendMultipleImages(intent);   
  50.                 }  
  51.         }  
  52.     }  
  53.   
  54.   
  55.     /** 
  56.      * 用TextView显示文本 
  57.      * 可以打开一般的文本文件 
  58.      * @param intent 
  59.      */  
  60.     private void handleSendText(Intent intent){  
  61.          TextView textView = new TextView(this);  
  62.            
  63.          //一般的文本处理,我们直接显示字符串  
  64.          String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);  
  65.          if(sharedText != null){  
  66.              textView.setText(sharedText);  
  67.          }  
  68.            
  69.            
  70.          //文本文件处理,从Uri中获取输入流,然后将输入流转换成字符串  
  71.          Uri textUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);  
  72.          if(textUri != null){  
  73.              try {  
  74.                  InputStream inputStream = this.getContentResolver().openInputStream(textUri);  
  75.                  textView.setText(inputStream2Byte(inputStream));  
  76.             } catch (Exception e) {  
  77.                 e.printStackTrace();  
  78.             }  
  79.          }  
  80.           
  81.          //设置给Activity  
  82.          setContentView(textView);  
  83.     }  
  84.       
  85.       
  86.     /** 
  87.      * 将输入流转换成字符串 
  88.      * @param inputStream 
  89.      * @return 
  90.      * @throws IOException 
  91.      */  
  92.     private String inputStream2Byte(InputStream inputStream) throws IOException{  
  93.         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  94.           
  95.         byte [] buffer = new byte[1024];  
  96.         int len = -1;  
  97.           
  98.         while((len = inputStream.read(buffer)) != -1){  
  99.             bos.write(buffer, 0, len);  
  100.         }  
  101.           
  102.         bos.close();  
  103.           
  104.         //指定编码格式为UIT-8  
  105.         return new String(bos.toByteArray(), "UTF-8");  
  106.     }  
  107.       
  108.       
  109.     /** 
  110.      * 用ImageView显示单张图片 
  111.      * @param intent 
  112.      */  
  113.     private void handleSendImage(Intent intent) {  
  114.         Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);  
  115.         if (imageUri != null) {  
  116.             ImageView imageView = new ImageView(this);  
  117.             imageView.setImageURI(imageUri);  
  118.             setContentView(imageView);  
  119.         }  
  120.     }  
  121.       
  122.       
  123.     /** 
  124.      * 用GridView显示多张图片 
  125.      * @param intent 
  126.      */  
  127.     private void handleSendMultipleImages(Intent intent) {  
  128.         final ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);  
  129.         if (imageUris != null) {  
  130.             GridView gridView = new GridView(this);  
  131.             //设置item的宽度  
  132.             gridView.setColumnWidth(130);  
  133.             //设置列为自动适应  
  134.             gridView.setNumColumns(GridView.AUTO_FIT);  
  135.             gridView.setAdapter(new GridAdapter(this, imageUris));  
  136.             setContentView(gridView);  
  137.               
  138.             gridView.setOnItemClickListener(new OnItemClickListener() {  
  139.   
  140.                 @Override  
  141.                 public void onItemClick(AdapterView<?> parent, View view,  
  142.                         final int position, long id) {  
  143.                       
  144.                     //点击GridView的item 可以分享图片给其他应用  
  145.                     //这里可以参考http://blog.csdn.net/xiaanming/article/details/9395991  
  146.                     Intent intent = new Intent();  
  147.                     intent.setAction(Intent.ACTION_SEND);  
  148.                     intent.putExtra(Intent.EXTRA_STREAM, imageUris.get(position));  
  149.                     intent.setType("image/*");  
  150.                     startActivity(Intent.createChooser(intent, "共享图片"));  
  151.                 }  
  152.             });  
  153.               
  154.         }  
  155.     }  
  156.       
  157.     /**  
  158.      * 重写BaseAdapter  
  159.      * @author xiaanming  
  160.      *  
  161.      */  
  162.     public class GridAdapter extends BaseAdapter{  
  163.         private Context mContext;  
  164.         private ArrayList<Uri> list;  
  165.           
  166.         public GridAdapter(Context mContext, ArrayList<Uri> list){  
  167.             this.list = list;  
  168.             this.mContext = mContext;  
  169.         }  
  170.   
  171.         @Override  
  172.         public int getCount() {  
  173.             return list.size();  
  174.         }  
  175.   
  176.         @Override  
  177.         public Object getItem(int position) {  
  178.             return list.get(position);  
  179.         }  
  180.   
  181.         @Override  
  182.         public long getItemId(int position) {  
  183.             return position;  
  184.         }  
  185.   
  186.         @Override  
  187.         public View getView(int position, View convertView, ViewGroup parent) {  
  188.             ImageView imageView;  
  189.             if(convertView == null){  
  190.                 imageView = new ImageView(mContext);  
  191.                 imageView.setPadding(8888);  
  192.             }else{  
  193.                 imageView = (ImageView) convertView;  
  194.             }  
  195.             imageView.setImageURI(list.get(position));  
  196.             return imageView;  
  197.         }  
  198.     }  
  199. }  

运行程序之后,然后我们选择系统图库,选择多张图片(如图一)进行分享,我们自己的应用程序分享多张界面(如图二)点击我们应用程序的item,选择分享单张图片(如图三)我们继续选择我们自己的应用程序来显示(如图四),新建一个备忘录保存,长按备忘录进行分享(如图五),分享文本文件的显示界面(如图六)

Android 应用程序之间内容分享详解(二)_第1张图片Android 应用程序之间内容分享详解(二)_第2张图片Android 应用程序之间内容分享详解(二)_第3张图片

Android 应用程序之间内容分享详解(二)_第4张图片Android 应用程序之间内容分享详解(二)_第5张图片Android 应用程序之间内容分享详解(二)_第6张图片



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

你可能感兴趣的:(Android 应用程序之间内容分享详解(二))