Android利用Intent.ACTION_SEND進(jìn)行分享
安卓系統(tǒng)本身可以很簡(jiǎn)便的實(shí)現(xiàn)分享功能,因?yàn)槲覀冎恍柘騭tartActivity傳遞一個(gè)ACTION_SEND的Intent,系統(tǒng)就為我們彈出一個(gè)應(yīng)用程序列表。其實(shí)在系統(tǒng)的文件管理器中,這應(yīng)該是我們常用的功能(包括文件的打開Intent.ACTION_VIEW)。
下面列出一個(gè)簡(jiǎn)單的分享方式
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
前兩行代碼不用說了,就是一個(gè)簡(jiǎn)單的Action Intent,第三行的Intent.EXTRA_TEXT,是文本類型,還有EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT等等,這些看字面意思就可以理解。
重點(diǎn)說一下Intent.EXTRA_STREAM。
設(shè)置合適的MIME類型,并且在附件數(shù)據(jù)中的EXTRA_STREAM中放一個(gè)指向數(shù)據(jù)的URI,就可以來分享二進(jìn)制數(shù)據(jù)。這個(gè)通常用來分享圖片,但是也可以用來分享任何類型的二進(jìn)制內(nèi)容,比如視頻,文件等等。
Intent shareIntent = newIntent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
下面說一下Intent.setType這個(gè)方法:
參數(shù)有很多種,簡(jiǎn)單列出幾個(gè),”text/plain”、”image/jpeg”、”audio/mp4a-latm”、”audio/x-mpeg”、 “video/mp4”還有很多很多…
這里給出一個(gè)獲取類型的方法
/** * 根據(jù)文件后綴名獲得對(duì)應(yīng)的MIME類型。 * @param filePath */ public static String getMimeType(String filePath) { MediaMetadataRetriever mmr = new MediaMetadataRetriever(); String mime = "text/plain"; if (filePath != null) { try { mmr.setDataSource(filePath); mime = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE); } catch (IllegalStateException e) { return mime; } catch (IllegalArgumentException e) { return mime; } catch (RuntimeException e) { return mime; } } return mime; }
我們可以**同時(shí)發(fā)送多條內(nèi)容**,要發(fā)送多條數(shù)據(jù),使用ACTION_SNED_MULTIPLE和一個(gè)指向數(shù)據(jù)的URI list。MIME類型根據(jù)分享的內(nèi)容不同而不同。例如,如果分享3張JPEG圖片,那么類型為"image/jpeg"。如果有不同的圖片類型,那么就應(yīng)該用"image/*"來匹配處理不同類型圖片的activity。如果要處理各種不同的類型就應(yīng)該用"*/*"了。正如前面提到的,分析和處理分享是數(shù)據(jù)是接收程序的事情了。
但是需要明確的一點(diǎn)是,**要確保URI指向的數(shù)據(jù)要可以被接收程序訪問到**。
另外一個(gè)知識(shí)點(diǎn)就是,我們可以對(duì)分享的App進(jìn)行篩選,比如我只想分享到QQ和微信平臺(tái),不關(guān)心人人網(wǎng),迅雷這樣的App
可通過Intent.createChooser方法實(shí)現(xiàn),
首先我們定義一個(gè)Action Intent
String type = getMimeType(path); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file)); shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); shareIntent.setType(getMimeType(path));
然后獲取可以用來發(fā)送該類型文件的ResolveInfo列表,也就是可以發(fā)送這種文件的應(yīng)用列表信息
List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(shareIntent, 0);
通過包名篩選出我們想要的應(yīng)用
ArrayList<Intent> targetIntents = new ArrayList<Intent>(); for (ResolveInfo info : resInfo) { ActivityInfo activityInfo = info.activityInfo; if (activityInfo.packageName.contains("com.tencent.mobileqq") ||activityInfo.packageName.contains("com.tencent.mm")) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setPackage(activityInfo.packageName); intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file)); intent.setClassName(activityInfo.packageName, activityInfo.name); targetIntents.add(intent); } }
最后用Intent.createChooser打開
Intent chooser = Intent.createChooser(targetIntents.remove(0), "Send mail..."); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{})); context.startActivity(chooser);
到此,利用Intent.ACTION_SEND進(jìn)行分享就差不多介紹完了,是不是比申請(qǐng)友盟以及各個(gè)平臺(tái)要方便的多…
附上源碼,以作備用
/** * 發(fā)送文件 * @param context * @param path */ public static void sendFileByOtherApp(Context context, String path) { File file = new File(path); if (file.exists()) { String type = getMimeType(path); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file)); shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); shareIntent.setType(getMimeType(path)); List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(shareIntent, 0); if (!resInfo.isEmpty()) { ArrayList<Intent> targetIntents = new ArrayList<Intent>(); for (ResolveInfo info : resInfo) { ActivityInfo activityInfo = info.activityInfo; if (activityInfo.packageName.contains("com.tencent.mobileqq") ||activityInfo.packageName.contains("com.tencent.mm")) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setPackage(activityInfo.packageName); intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file)); intent.setClassName(activityInfo.packageName, activityInfo.name); targetIntents.add(intent); } } Intent chooser = Intent.createChooser(targetIntents.remove(0), "Send mail..."); chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{})); context.startActivity(chooser); } } }
當(dāng)然,我們也可以做一個(gè)Activity,像QQ微信一樣,來接收文件或者wen z,只要會(huì)使用intentfilter就可以了
<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter>
然后在oncreate方法中
if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // 處理發(fā)送來的文字 } else if (type.startsWith("image/")) { handleSendImage(intent); // 處理發(fā)送來的圖片 } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // 處理發(fā)送來的多張圖片 } } else { // 處理其他intents,比如由主屏啟動(dòng) }
這樣基本用法就介紹完了,基本的分享功能差不多可以完成,但是想要分享圖文內(nèi)容,或者自定義分享界面,可能就需要再深度挖掘了。
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Android中Activity的四種啟動(dòng)模式和onNewIntent()
- Android使用Intent顯示實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)
- Android使用Intent隱式實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)
- Android使用Intent.ACTION_SEND分享圖片和文字內(nèi)容的示例代碼
- Android Intent實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的兩種方法
- Android Intent實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的方法示例
- Android開發(fā)中使用Intent打開第三方應(yīng)用及驗(yàn)證可用性的方法詳解
- Android 基于IntentService的文件下載的示例代碼
- Android編程實(shí)現(xiàn)全局獲取Context及使用Intent傳遞對(duì)象的方法詳解
- Android開發(fā)中Intent.Action各種常見的作用匯總
相關(guān)文章
Android 優(yōu)雅的實(shí)現(xiàn)通用格式化編輯
這篇文章主要介紹了Android 優(yōu)雅的實(shí)現(xiàn)通用格式化編輯,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03Android與H5交互產(chǎn)生Script Error踩坑解決
這篇文章主要為大家介紹了Android與H5交互產(chǎn)生Script Error問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08android開發(fā)中獲取手機(jī)分辨率大小的方法
不管是在我們的布局還是在實(shí)現(xiàn)代碼中進(jìn)行操控,我們的靈活性都不是局限于一個(gè)固定的數(shù)值,而是面對(duì)不同的手機(jī)對(duì)象都有一個(gè)適應(yīng)的數(shù)值。2013-04-04Android布局控件View?ViewRootImpl?WindowManagerService關(guān)系
這篇文章主要為大家介紹了Android布局控件View?ViewRootImpl?WindowManagerService關(guān)系示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Android短信備份及數(shù)據(jù)插入實(shí)現(xiàn)代碼解析
這篇文章主要介紹了Android短信備份及數(shù)據(jù)插入實(shí)現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11android編程實(shí)現(xiàn)的自定義注釋模板實(shí)例
這篇文章主要介紹了android編程實(shí)現(xiàn)的自定義注釋模板,以完整實(shí)例形式分析了Android自定義魔板的定義及具體實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2015-11-11Flutter事件監(jiān)聽與EventBus事件的應(yīng)用詳解
EventBus的核心是基于Streams。它允許偵聽器訂閱事件并允許發(fā)布者觸發(fā)事件,使得不同組件的數(shù)據(jù)不需要一層層傳遞,可以直接通過EventBus實(shí)現(xiàn)跨組件通訊2023-04-04