职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 498|回复: 6

android平台下,淘宝客户端开发之——登陆

[复制链接]
jinchang 发表于 2011-9-7 09:48 | 显示全部楼层 |阅读模式
1.啰嗦的理论写在前面
在人们的印象中,各种社交网站的客户端都把登陆作为第一步,但对于淘宝客户端,我们没有必要这样做。这是由于,好多懒人们懒得登陆或注册,因此就不用你的客户端了,直接影响将近三分之一的网站流量啊(这是看官方论坛中有人统计的)。因此我们在不得不登陆的时候再设置登陆这步,而不是放在客户端的开始。
2.进行登陆的过程
淘宝的登陆为了安全起见,规定以内嵌wap页的形式网页登陆,因此登陆这步我们就没必要纠结于界面设计了,直接放一个WebView就OK了(url用Mars.jar包中的MtopLogin类的getLoginUrl()方法得到)。在页面中实现登陆、授权后,MtopLogin类可以getTopSession(),这个参数在后续的得打用户、进行买卖中将用到。
3.实现该过程的准备:
下载mars.alpha-v0.6(http://www.archermind.com/mtop)
(1)新建android工程,在工程中导入mars.jar包(mars.alpha-v0.6\sdk\marr.jar)
(2)AndroidManifest.xml  中增加internet访问权和手机硬件访问权
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
(3)建res\layout\login.xml  将一个webview、一个按钮、一个textview拖到一个LinearLayout中。
login.xml代码:
Xml代码  
<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    androidrientation="vertical">  
    <WebView   
        android:id="@+id/wv1" android:layout_width="match_parent" android:layout_height="187dp">  
    </WebView>  
    <Button android:text="获得用户信息" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>  
    <TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="match_parent"></TextView>  
</LinearLayout>  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          androidrientation="vertical">
          <WebView
                  android:id="@+id/wv1" android:layout_width="match_parent" android:layout_height="187dp">
        </WebView>
          <Button android:text="获得用户信息" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
          <TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="match_parent"></TextView>
</LinearLayout>

(4)主要java代码:
获取web的url方法:
Java代码  
mWebView = (WebView) findViewById(R.id.webview);   
// get WebSetting object,设置支持Javascript的参数   
mWebView.getSettings().setJavaScriptEnabled(true);   
// 页面缩放设置   
mWebView.getSettings().setBuiltInZoomControls(true);   
// 使页面获得焦点   
mWebView.requestFocus();   
  
String mtopUrl = "http://api.m.taobao.com/rest/api2.do";   
String v = "";   
String appKey = "12311413";// 你的应用所申请的appkey和secret   
String secret = "48d7e406fadaf1b1f7abb32a95a71c33";   
ttid = "";   
v = "androidClient";   
mtopLogin = new MtopLogin(mtopUrl, v, imei, imsi, appKey, secret, ttid);   
try {   
    try {   
        mWebView.loadUrl(mtopLogin.getLoginUrl());   
    } catch (ApiException e) {   
  
        e.printStackTrace();   
    }   
} catch (JSONException e) {   
    mWebView.loadUrl("http://www.baidu.com");   
}   
  
/* response WebView event */  
mWebView.setWebViewClient(new WebViewClient() {   
    public boolean shouldOverrideUrlLoading(WebView view, String url) {   
        view.loadUrl(url);   
        return true;   
    }   
});  

        mWebView = (WebView) findViewById(R.id.webview);
        // get WebSetting object,设置支持Javascript的参数
        mWebView.getSettings().setJavaScriptEnabled(true);
        // 页面缩放设置
        mWebView.getSettings().setBuiltInZoomControls(true);
        // 使页面获得焦点
        mWebView.requestFocus();

        String mtopUrl = "http://api.m.taobao.com/rest/api2.do";
        String v = "";
        String appKey = "12311413";// 你的应用所申请的appkey和secret
        String secret = "48d7e406fadaf1b1f7abb32a95a71c33";
        ttid = "";
        v = "androidClient";
        mtopLogin = new MtopLogin(mtopUrl, v, imei, imsi, appKey, secret, ttid);
        try {
            try {
                mWebView.loadUrl(mtopLogin.getLoginUrl());
            } catch (ApiException e) {

                e.printStackTrace();
            }
        } catch (JSONException e) {
            mWebView.loadUrl("http://www.baidu.com");
        }

        /* response WebView event */
        mWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

button的onclick事件:
Java代码  
@Override  
        public void onClick(View v) {   
            try {   
                try {   
                    mtopLogin.getUserSessionKey();   
                } catch (ApiException e) {   
                    e.printStackTrace();   
                }   
                mtopLogin.getTopsession();   
            } catch (JSONException e1) {   
  
                e1.printStackTrace();   
            }   
  
            OpenServiceClient.init("http://gw.api.taobao.com/router/rest",   
                    appKey, secret, getApplicationContext(), "", imei, imsi);//必须有这步才能调用UserDomainApi的方法   
  
            try {   
  
                User user = UserDomainApi.getUser("nick", "",         mtopLogin.getTopsession());//通过session获得user信息具体见doc中的文档   
                text.setText(user.getNick() + user.getCreated());   
            } catch (ApiException e) {   
                text.setText("获取失败!");   
            }   
        }  

@Override
        public void onClick(View v) {
            try {
                try {
                    mtopLogin.getUserSessionKey();
                } catch (ApiException e) {
                    e.printStackTrace();
                }
                mtopLogin.getTopsession();
            } catch (JSONException e1) {

                e1.printStackTrace();
            }

            OpenServiceClient.init("http://gw.api.taobao.com/router/rest",
                    appKey, secret, getApplicationContext(), "", imei, imsi);//必须有这步才能调用UserDomainApi的方法

            try {

                User user = UserDomainApi.getUser("nick", "",         mtopLogin.getTopsession());//通过session获得user信息具体见doc中的文档
                text.setText(user.getNick() + user.getCreated());
            } catch (ApiException e) {
                text.setText("获取失败!");
            }
        }

(5)注意事项,获取imei,imsi的参数在虚拟机与在真机中不同。
在真机测试中用:
Java代码  
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);   
    String imei =  telephonyManager.getDeviceId();   
    String imsi = telephonyManager.getSubscriberId();  

TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    String imei =  telephonyManager.getDeviceId();
    String imsi = telephonyManager.getSubscriberId();

来获取。
虚拟机中这么获取会报错的。
虚拟机中使用:
Java代码  
String imei = "89014103211118510720";//瞎编就行~~~~(>_<)~~~~   
String imsi = "310260000000000";//瞎编就行O(∩_∩)O  

String imei = "89014103211118510720";//瞎编就行~~~~(>_<)~~~~
String imsi = "310260000000000";//瞎编就行O(∩_∩)O

(6)测试说明:
运行应用后,在webview中登陆并实现授权,然后点击按钮“获取用户信息”即可得到登陆的用户名,证明登陆成功。
其实在执行 mtopLogin.getUserSessionKey();后已经登陆成功获取到了其他操作所需的session,token等。
*****************************失恋分割线*************************
没能好好珍惜你是我对我们之间最大的遗憾

hxy 发表于 2011-9-7 09:48 | 显示全部楼层
我觉得贴个图,可读性会大大增加

钰云 发表于 2011-9-7 09:48 | 显示全部楼层
webview不太清楚,放下图

broken 发表于 2011-9-7 09:49 | 显示全部楼层
其实我觉得oauth授权直接用自带浏览器就ok了嘛~~

gz-vps 发表于 2011-9-7 09:49 | 显示全部楼层
建 议上图

北大青鸟 发表于 2011-9-7 09:49 | 显示全部楼层
sfshine 写道
其实我觉得oauth授权直接用自带浏览器就ok了嘛~~


请假OAuth自带浏览器授权后返回时,如何关闭浏览器页面

我用新浪微博时,返回后授权页面还是开着,需要自己关闭,但是用WebView就可以随便操作了

最关键的是,如果用户选择用UC等去授权,很多时候是要失败的

找不到我 发表于 2011-9-7 09:49 | 显示全部楼层
推荐用webview. 也可以试试友盟出的第三方oauth验证包,很不错。。
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-29 00:20 , Processed in 0.122924 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表