zoukankan      html  css  js  c++  java
  • Android 应用程序之间内容分享详解(二)

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





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


  • 相关阅读:
    预览graph取消item的value单位自动转换
    Elasticsearch内存分配设置详解
    Linux core 文件介绍
    案例一 整套项目打包部署
    Linux删除文件提示Operation not permitted的处理办法
    python优雅获取本机 IP 方法
    nginx open files limits 导致大量错误信息
    excel表格用协程插入到mysql
    mysql基本操作
    装饰器
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3211844.html
Copyright © 2011-2022 走看看