最近需要在开发的安卓项目中添加新浪微博一件关注的功能, 本来是一个很简单的功能, 就是调用新浪微博客户端显示用户信息的 Activity
, 然后用户就点击关注按钮就可以了。 本来是很简单的功能, 可以网上找到的几乎都是 JS 的代码, 或者是要注册新浪微博 SDK 的代码, 这么简单的功能应该不用注册什么 SDK 的, 也不想参合什么 JS , 只要研究一下新浪微博客户端的 Activity
就可以了。
首先我们需要使用 AXMLPrinter2.jar 反编译新浪微博的 AndroidManifest.xml
, 从中查找显示用户信息的页面, 反编译代码如下:
java -jar AXMLPrinter2.jar AndroidManifest.xml > a.xml
打开反编译出来的 a.xml
, 搜索 userinfo
, 很幸运的找到了 UserInfoActivity
,如下所示:
<activity android:theme="@7F0B0029" android:name="UserInfoActivity"
android:configChanges="0x000000A0">
<intent-filter>
<action android:name="android.intent.action.VIEW">
</action>
<category android:name="android.intent.category.DEFAULT">
</category>
<categoryandroid:name="android.intent.category.BROWSABLE">
</category>
<data android:scheme="sinaweibo" android:host="userinfo">
</data>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW">
</action>
<category android:name="android.intent.category.DEFAULT">
</category>
<category android:name="android.intent.category.BROWSABLE">
</category>
<data android:scheme="http" android:host="weibo.cn"
android:path="/qr/userinfo">
</data>
</intent-filter>
</activity>
UserInfoActivity 注册了两个 intent-filter
, 第一个注册的 url 是 sinaweibo://userinfo?uid=3444956000
, 有了这个信息, 通过如下的代码调用新浪微博客户端显示用户信息了:
var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("sinaweibo://userinfo?uid=3444956000");
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
不过, 上面代码的前提是用户已经安装了新浪微博客户端,否则运行会报错, 幸好还有第二个, 我们可以使用下面的代码进行调用:
var intent = new Intent(Intent.ActionView);
var uri = Android.Net.Uri.Parse("https://weibo.cn/qr/userinfo?uid=3444956000");
intent.SetData(uri);
var chooseIntent = Intent.CreateChooser(intent, "Weibo");
StartActivity(chooseIntent);
上面代码的效果是:
再次鄙视一下新浪微博的开放程度, 居然有这个功能都不开放。
本来打算用相同的方法在腾讯微信上做相同的功能, 却发现腾讯已经将显示微信号的 Activity 设置为私有的 android:exported="false"
, 居然比新浪还要封闭, 真是无语了!