Android 利用Intent实现分享

    xiaoxiao2021-12-10  16

    Android实现分享到微博,微信等功能,大概有两个实现方向

    1、集成官方SDK,无论微信还是微博等平台,都有自己的开发者后台,可以去申请帐号,下载sdk,集成。

    也可以利用例如ShareSDK这样的平台来继承。

    2、就是我本文要介绍的方式了,用系统的Intent来实现分享。

    先来简单介绍一下分享功能,分享功能,在几乎所有的app中都有实现,原由就是通过分享来传播自己的软件,

    也可以通过分享来实现简单社交的功能。

    我最近做的APP当然也有这个功能,我是继承官方sdk做的,但是有这么几个缺点。

    第一、会导致最终的apk变大

    第二、集成代码量大

    第三、需要在各个平台的官方后台申请appkey等东西,工作量大,审核时间不受控制

    第四、就是我遇到的情况,被官方平台封了……

    当然,集成官方sdk好处也很多,最重要的就是用Intent分享,只能分享图文,其他功能无法实现,而官方则有

    更多的分享功能

    好了,我们还是来看一下怎么用Intent实现分享吧

    Android SDK在启动Activity的时候,给我们提供了两种方式,第一种就是平时都在用的

    Intent in = new Intent(this, ShareActivity.class); startActivity(in); 我们也称之为显示启动,这种启动方式,只能在自己的应用里启动,无法启动其他应用的Activity

    而我们要实现的分享功能,一定是启动别的应用,比如微信,微博等的Activity了

    所以,我们需要用隐式启动

    隐式启动,就是不指定具体的启动的Activity,而是通过指定action来实现启动Activity的功能,

    action 就是目标Activity在Manifest中定义的Action,比如

    <span style="white-space:pre"> </span><activity android:name=".ShareActivity" android:exported="true"<span style="font-family: Arial, Helvetica, sans-serif; color: rgb(169, 183, 198);">></span> <intent-filter> <action android:name="com.by.test.shareactivity"/> </intent-filter> </activity>

    这样,action就是其他应用启动我这个Activity时的Action, android:exported="true"表示允许被其他应用启动

    那么,怎么从别的应用启动这个Activity呢

    <span style="white-space:pre"> </span>Intent in = new Intent(); in.setAction("com.by.test.shareactivity"); startActivity(in);

    很简单,这就可以了,如果有多个activity定义了同一个Action,则在启动Action时会出现选择界面,让用户来选择

    启动哪个,比如在通过应用跳转到浏览器的时候,如果手机安装了多个浏览器,就会弹出选择界面。

    /** * 分享文本到全平台 * @param context 上下文关系 * @param text 要分享的文本 */ public static void shareTextToAll(Context context, String text) { Intent intent=new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, text); context.startActivity(Intent.createChooser(intent, "请选择")); } /** * 分享单张图片到全平台 * @param context 上下文关系 * @param text 文本内容,并非所有平台在分享图片时候都支持此参数 * @param img 图片uri地址 */ public static void shareImgToAll(Context context, String text, Uri img) { Intent intent=new Intent(Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_TEXT, text); intent.putExtra(Intent.EXTRA_STREAM, img); context.startActivity(Intent.createChooser(intent, "请选择")); } /** * 分享多张图片到全平台 * @param context 上下文关系 * @param text 文本内容 * @param images 图片Uri地址的集合 */ public static void shareImgsToAll(Context context, String text, ArrayList<Uri> images) { Intent intent=new Intent(Intent.ACTION_SEND_MULTIPLE); intent.setType("image/*"); intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, images); intent.putExtra(Intent.EXTRA_TEXT, text); context.startActivity(Intent.createChooser(intent, "请选择")); } setType是设置类型,putxxx是设置Intent参数,目标Activity会接受到。

    这是分享到全平台,调用这个代码,会显示手机上所有满足的应用让用户选择。

    如果想分享到某个固定平台,可以多添加一个条件

    intent.setPackage("target packageName");

    而如果某个应用里,还有多个满足,想指定固定的某个,比如微信分享有好友和朋友圈之分

    可以这样设置

    <span style="white-space:pre"> </span>ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI"); intent.setComponent(comp);这个设置的就是微信朋友圈,第一个参数是微信的包名,第二个参数是微信朋友圈的Activity

    以上是,调用分享,可以分享图文。

    如果想在自己的应用里集成分享,使其他应用在分享的时候,我们的应用可以出现在用户的选择列表中

    需要我们自己在需要集成分享的activity里添加一下filter

    <span style="white-space:pre"> </span><activity android:name=".ShareActivity" android:exported="true"> <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"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> </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> </activity>

    没个intent-filter都是一个选择器,想要启动我这个activity,需要满足这三个选择器中的至少一个。

    其实这三个选择器,分别对应的就是纯文本消息,图文消息和多图文消息。

    定义好这个后,在有痛过Intent启动分享的功能时,我们的应用也添加到了用户的选择当中

    当用户选择我们时,我们通过Intent来获取用户传递给我们的消息,并实现自己的逻辑功能

    <span style="white-space:pre"> </span>TextView textView = (TextView) findViewById(R.id.textView); Intent intent = getIntent(); String text = intent.getStringExtra(Intent.EXTRA_TEXT); String type = intent.getType(); String action = intent.getAction(); textView.setText(text + "\n" + type + "\n" + action); if (type.equals("image/*")) { ImageView imageView = (ImageView) findViewById(R.id.imageView); if (action.equals(Intent.ACTION_SEND)) { Uri img = intent.getParcelableExtra(Intent.EXTRA_STREAM); imageView.setImageURI(img); } else if (action.equals(Intent.ACTION_SEND_MULTIPLE)) { ArrayList<Uri> list = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (list.size() > 0) { imageView.setImageURI(list.get(0)); } } }

    文中示例项目下载地址:https://github.com/dengdaijc/ShareIntentTest 工具类下载地址:http://download.csdn.net/detail/dengdaijc/9655988

    转载请注明原文地址: https://ju.6miu.com/read-700159.html

    最新回复(0)