国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android利用Intent.ACTION_SEND進行分享

2019-12-12 00:56:59
字體:
供稿:網(wǎng)友

安卓系統(tǒng)本身可以很簡便的實現(xiàn)分享功能,因為我們只需向startActivity傳遞一個ACTION_SEND的Intent,系統(tǒng)就為我們彈出一個應用程序列表。其實在系統(tǒng)的文件管理器中,這應該是我們常用的功能(包括文件的打開Intent.ACTION_VIEW)。

下面列出一個簡單的分享方式

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);

前兩行代碼不用說了,就是一個簡單的Action Intent,第三行的Intent.EXTRA_TEXT,是文本類型,還有EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT等等,這些看字面意思就可以理解。
重點說一下Intent.EXTRA_STREAM。

設置合適的MIME類型,并且在附件數(shù)據(jù)中的EXTRA_STREAM中放一個指向數(shù)據(jù)的URI,就可以來分享二進制數(shù)據(jù)。這個通常用來分享圖片,但是也可以用來分享任何類型的二進制內(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這個方法:
參數(shù)有很多種,簡單列出幾個,”text/plain”、”image/jpeg”、”audio/mp4a-latm”、”audio/x-mpeg”、 “video/mp4”還有很多很多…
這里給出一個獲取類型的方法

 /** * 根據(jù)文件后綴名獲得對應的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; }

我們可以**同時發(fā)送多條內(nèi)容**,要發(fā)送多條數(shù)據(jù),使用ACTION_SNED_MULTIPLE和一個指向數(shù)據(jù)的URI list。MIME類型根據(jù)分享的內(nèi)容不同而不同。例如,如果分享3張JPEG圖片,那么類型為"image/jpeg"。如果有不同的圖片類型,那么就應該用"image/*"來匹配處理不同類型圖片的activity。如果要處理各種不同的類型就應該用"*/*"了。正如前面提到的,分析和處理分享是數(shù)據(jù)是接收程序的事情了。

但是需要明確的一點是,**要確保URI指向的數(shù)據(jù)要可以被接收程序訪問到**。

另外一個知識點就是,我們可以對分享的App進行篩選,比如我只想分享到QQ和微信平臺,不關心人人網(wǎng),迅雷這樣的App

可通過Intent.createChooser方法實現(xiàn),

首先我們定義一個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ā)送這種文件的應用列表信息

List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(shareIntent, 0);

通過包名篩選出我們想要的應用

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進行分享就差不多介紹完了,是不是比申請友盟以及各個平臺要方便的多…

附上源碼,以作備用

/** * 發(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); } } }

當然,我們也可以做一個Activity,像QQ微信一樣,來接收文件或者wen z,只要會使用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,比如由主屏啟動 }

這樣基本用法就介紹完了,基本的分享功能差不多可以完成,但是想要分享圖文內(nèi)容,或者自定義分享界面,可能就需要再深度挖掘了。

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松潘县| 修武县| 建水县| 东山县| 桂林市| 新郑市| 额尔古纳市| 闵行区| 游戏| 万州区| 得荣县| 东宁县| 渝北区| 江孜县| 翁源县| 延长县| 涞水县| 望江县| 聂拉木县| 日喀则市| 彝良县| 清水河县| 闽清县| 井冈山市| 潍坊市| 临洮县| 淳化县| 漳州市| 崇信县| 绩溪县| 浮山县| 册亨县| 扎赉特旗| 贵阳市| 镇赉县| 阳春市| 扶绥县| 谢通门县| 广安市| 拉孜县| 政和县|