先來說說分享,畢竟沒有分享何來接收分享可談? 分享目前已實現的有兩種方式:後臺代碼實現、ShareActionProvider實現,接著先說通過代碼實現 這裡分享的是圖片,圖片以二進位的形式進行傳遞,所以用Intent.EXTRA_STREAM來標誌附加的消息類型。 如果是文字的話原理是一樣的,只需 ...
先來說說分享,畢竟沒有分享何來接收分享可談?
分享目前已實現的有兩種方式:後臺代碼實現、ShareActionProvider實現,接著先說通過代碼實現
Intent intent=new Intent(Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("/storage/emulated/0/Pictures/145.jpg")); startActivity(Intent.createChooser(intent,"share this image to..."));
這裡分享的是圖片,圖片以二進位的形式進行傳遞,所以用Intent.EXTRA_STREAM來標誌附加的消息類型。
如果是文字的話原理是一樣的,只需將Type和附加信息改成如下即可
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"hello world");
這們就簡單實現了內容分享,點擊要分享的內容系統就會自動幫我們尋找實現了接收內容的程式(微信、QQ、藍牙等),並展示出來讓我們選擇,如下圖
那用ShareActionProvider如何實現的呢,首先在菜單文件里添加一個item
<item android:id="@+id/share" android:orderInCategory="200" android:title="share" android:icon="@android:drawable/ic_menu_share" app:showAsAction="always" app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
這裡使用的是v7包下的ShareActionProvider,對應的後臺代碼裡面也要用v7包下的類,需要註意的是app:actionProviderClass的首碼是app而不是android,如果寫成android會報錯並閃退。如果一切正常那麼程式啟動後應付在標題欄顯示一個分享的圖片,額,確切的說是圖標,點擊的後也會展示出能內容的程式,如下圖
添加完畢在後臺的代碼裡面也要設置要分享的內容的,不然程式怎麼知道要分享什麼呢
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); MenuItem item=menu.findItem(R.id.share); ShareActionProvider sap= (ShareActionProvider) MenuItemCompat.getActionProvider(item); Intent intent=new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT,"hi jiujie zhu,do u have lunch?"); if(sap!=null){ sap.setShareIntent(intent); } return true; }
這裡分享的是文本信息。
分享完畢就要接收,再來說說如何接收
接收其實挺簡單的,至少比我想的簡單(我是新手我自豪,咩嘿嘿~~~)
以接收圖片為例,新建一個Activity,在清單文件裡面設置action、data、category即可,怎麼跟接收器有點像呢,看代碼
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> </intent-filter>
data表示接收的文件類型,如果是文本類型的是不會接收的。這樣進行標註後再分享內容時系統就會識別咱們的程式並展示給用戶選擇了,請看第二張圖裡面的ReceiveSharedContentAcitvity,這個就是自定義的接收內容的Activity,就這麼簡單啊。
光能接收並沒用,關鍵是如何獲取分享的內容和如何處理接收到的內容
private void handleImage(){ Intent intent=getIntent(); String action=intent.getAction(); String type=intent.getType(); if(action.equals(Intent.ACTION_SEND)&&type.equals("image/*")){ Uri uri=intent.getParcelableExtra(Intent.EXTRA_STREAM); //接收多張圖片 //ArrayList<Uri> uris=intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if(uri!=null ){ try { FileInputStream fileInputStream=new FileInputStream(uri.getPath()); Bitmap bitmap= BitmapFactory.decodeStream(fileInputStream); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } }
通過getIntent方法獲取到包含分享內容的Intent,然後就可以獲取裡面的內容了。這是說明一點的是如果你分享的圖片是在sd卡的話,請給程式添加讀取sd卡的許可權,不然會顯示permission denied
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
上面說的都是分享一條文本或圖片,如果要多個呢,一樣的!只需在分享時用ArratList進行封裝就行了,對於接收者來說,需要把action改成
<action android:name="android.intent.action.SEND_MULTIPLEND"/>
表示接收多個內容,在代碼裡面從Intent中獲取內容時用getParcelableArrayListExtra而不是getParcelableExtra。