Android利⽤Intent.ACTION_SEND进⾏分享
安卓系统本⾝可以很简便的实现分享功能,因为我们只需向startActivity传递⼀个ACTION_SEND的Intent,系统就为我们弹出⼀个应⽤程序列表。其实在系统的⽂件管理器中,这应该是我们常⽤的功能(包括⽂件的打开Intent.ACTION_VIEW)。
下⾯列出⼀个简单的分享⽅式
Intent shareIntent = new Intent();
shareIntent.tAction(Intent.ACTION_SEND);
ndIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to nd.");
ndIntent.tType("text/plain");
startActivity(ndIntent);
前两⾏代码不⽤说了,就是⼀个简单的Action Intent,第三⾏的Intent.EXTRA_TEXT,是⽂本类型,还有EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT等等,这些看字⾯意思就可以理解。
重点说⼀下Intent.EXTRA_STREAM。
设置合适的MIME类型,并且在附件数据中的EXTRA_STREAM中放⼀个指向数据的URI,就可以来分享⼆进制数据。这个通常⽤来分享图⽚,但是也可以⽤来分享任何类型的⼆进制内容,⽐如视频,⽂件等等。
Intent shareIntent = newIntent();
shareIntent.tAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.tType("image/jpeg");
ateChoor(shareIntent, getResources().getText(R.string.nd_to)));
下⾯说⼀下Intent.tType这个⽅法:
参数有很多种,简单列出⼏个,”text/plain”、”image/jpeg”、”audio/mp4a-latm”、”audio/x-mpeg”、 “video/mp4”还有很多很多…
这⾥给出⼀个获取类型的⽅法
/**
* 根据⽂件后缀名获得对应的MIME类型。
* @param filePath
*/
public static String getMimeType(String filePath) {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
String mime = "text/plain";
if (filePath != null) {
try {
mmr.tDataSource(filePath);
mime = actMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE);
} catch (IllegalStateException e) {
return mime;
} catch (IllegalArgumentException e) {
return mime;
} catch (RuntimeException e) {
荆州市绩效考核入口return mime;
}
}
return mime;
}
我们可以**同时发送多条内容**,要发送多条数据,使⽤ACTION_SNED_MULTIPLE和⼀个指向数据的URI list。MIME类型根据分享的内容不同⽽不同。例如,如果分享3张JPEG图⽚,那么类型为"image/jpeg"。如果有不同的图⽚类型,那么就应该⽤"image/*"来匹配处理不同类型图⽚的activity。如果要处理各种不同的类型就应该⽤"*/*"了。正如前⾯提到的,分析和处理分享是数据是接收程序的事情了。
但是需要明确的⼀点是,**要确保URI指向的数据要可以被接收程序访问到**。
另外⼀个知识点就是,我们可以对分享的App进⾏筛选,⽐如我只想分享到QQ和微信平台,不关⼼⼈⼈⽹,迅雷这样的App
可通过ateChoor⽅法实现,
⾸先我们定义⼀个Action Intent
String type = getMimeType(path);
Intent shareIntent = new Intent();
shareIntent.tAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
shareIntent.tFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
祝福中国shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
shareIntent.tType(getMimeType(path));
然后获取可以⽤来发送该类型⽂件的ResolveInfo列表,也就是可以发送这种⽂件的应⽤列表信息
List<ResolveInfo> resInfo = PackageManager().queryIntentActivities(shareIntent, 0);
通过包名筛选出我们想要的应⽤
ArrayList<Intent> targetIntents = new ArrayList<Intent>();
for (ResolveInfo info : resInfo) {
ActivityInfo activityInfo = info.activityInfo;
if (ains("bileqq")
||ains("")) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.tPackage(activityInfo.packageName);
intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
intent.tClassName(activityInfo.packageName, activityInfo.name);
陶行知名言名句targetIntents.add(intent);
}
}
最后⽤ateChoor打开
Intent choor = ve(0), "");
choor.putExtra(Intent.EXTRA_INITIAL_INTENTS, Array(new Parcelable[]{}));
context.startActivity(choor);
到此,利⽤Intent.ACTION_SEND进⾏分享就差不多介绍完了,是不是⽐申请友盟以及各个平台要⽅便的多…附上源码,以作备⽤
/**
* 发送⽂件
* @param context木型人
* @param path
*/
public static void ndFileByOtherApp(Context context, String path) {
File file = new File(path);
if (ists()) {
String type = getMimeType(path);
Intent shareIntent = new Intent();
shareIntent.tAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
shareIntent.tFlags(Intent.FLAG_ACTIVITY_NEW_TASK);美少女头像
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
shareIntent.tType(getMimeType(path));
List<ResolveInfo> resInfo = PackageManager().queryIntentActivities(shareIntent, 0);
if (!resInfo.isEmpty()) {
ArrayList<Intent> targetIntents = new ArrayList<Intent>();
for (ResolveInfo info : resInfo) {
ActivityInfo activityInfo = info.activityInfo;
大熊猫习性
if (ains("bileqq")
||ains("")) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.tPackage(activityInfo.packageName);
intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
intent.tClassName(activityInfo.packageName, activityInfo.name);
targetIntents.add(intent);
}
}
Intent choor = ve(0), "");
choor.putExtra(Intent.EXTRA_INITIAL_INTENTS, Array(new Parcelable[]{}));
context.startActivity(choor);
}
}
}
当然,我们也可以做⼀个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); // 处理发送来的⽂字
} el if (type.startsWith("image/")) {
handleSendImage(intent); // 处理发送来的图⽚
}
} el if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
if (type.startsWith("image/")) {
handleSendMultipleImages(intent); // 处理发送来的多张图⽚
}
} el {
// 处理其他intents,⽐如由主屏启动
}
这样基本⽤法就介绍完了,基本的分享功能差不多可以完成,但是想要分享图⽂内容,或者⾃定义分享界⾯,可能就需要再深度挖掘了。
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。