先來說說分享,畢竟沒有分享何來接收分享可談?
分享目前已實現的有兩種方式:后台代碼實現、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。