Android 應用程式之間內容分享詳解(二)

來源:互聯網
上載者:User

轉載請註明出處: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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = getIntent();//獲得Intent的ActionString action = intent.getAction();//獲得Intent的MIME typeString 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-8return 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() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,final int position, long id) {//點擊GridView的item 可以分享圖片給其他應用//這裡可以參考http://blog.csdn.net/xiaanming/article/details/9395991Intent 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;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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,選擇分享單張圖片(三)我們繼續選擇我們自己的應用程式來顯示(四),建立一個備忘錄儲存,長按備忘錄進行分享(五),分享文字檔的顯示介面(六)





內容大概就是這樣,睡覺去了如果你覺得這篇文章對你有點協助,你就幫我頂頂,謝謝大家關注!


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.