• 7.腾讯微博Android客户端开发——自动获取验证码(1) .


     通过前面的介绍,我们成功获取了Access Token,但是在该过程中有个不好的地方:用户输入完QQ信息后,需要记录验证码,然后返回至Activity手动输入验证码,这将会使我们的程序显得非常不友好。我们能不能让程序自动获取到平台返回过来的验证码,而不需要用户手动收入呢?通过参考其它资料,找到了两种解决方法,本次和大家分享第一种解决方案。

    在进行正题之前,我们先来做一个简单的实验。下面是我编写的一个简单的测试网页,其中包含两个链接,第一个链接比较容易理解,点击后跳转到百度,第二个链接如果在我们的PC浏览器点击肯定会提示找不到网页,但是放在Android系统中呢?下面我们来进行测试。

    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
    2.   
    3. <html>  
    4. <head>  
    5.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
    6.     <title>Untitled</title>  
    7. </head>  
    8. <style>  
    9. body  
    10. {  
    11.     font-size: 20px;  
    12.     font-weight: bold;  
    13.     color: #0000FF;  
    14. }  
    15. </style>  
    16. <body>  
    17.   
    18. <a href="http://www.baidu.com">百度一下</a><br><br>  
    19. <a href="android://MainActivity?id=coolszy">启动Android</a>  
    20.   
    21. </body>  
    22. </html>  

    创建一个Android项目,其中MainActivity界面如下:

     同时“打开”按钮进行如下操作:

    1. btnOpen=(Button)findViewById(R.id.btnOpen);  
    2. btnOpen.setOnClickListener(new OnClickListener()  
    3. {  
    4.     @Override  
    5.     public void onClick(View v)  
    6.     {  
    7.         //测试网页地址   
    8.         Uri uri = Uri.parse("http://192.168.1.100:8080/index.htm");   
    9.         Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
    10.         startActivity(intent);  
    11.     }  
    12. });  

    运行模拟器。点击“打开”按钮,点击“启动Android”链接并没有任何效果,在Logcat下输出如下错误信息:

    1. <pre class="java" name="code"> android://MainActivity?id=coolszy The protocol is not supported.  


     

    
    
    1. <span style="font-size:16px;">提示我们的<span style="font-family:Times New Roman;">android</span><span style="font-family:宋体;">协议不支持。熟悉</span><span style="font-family:Times New Roman;"><intent-filter></span><span style="font-family:宋体;">的朋友应该知道 </span><span style="font-family:Times New Roman;"><action>, <category>,</span><span style="font-family:宋体;">,和</span><span style="font-family:Times New Roman;"><data> </span><span style="font-family:宋体;">这几个元素,通过配置这几个元素我们可以隐性的启动</span><span style="font-family:Times New Roman;">Activity</span><span style="font-family:宋体;">,在这里我们可以通过配置这三个元素让我们的浏览器支持</span><span style="font-family:Times New Roman;">android</span><span style="font-family:宋体;">协议,在</span><span style="font-family:Times New Roman;">MainActivity</span><span style="font-family:宋体;">的</span></span>  
    1. <intent-filter>  
    2.     <action android:name="android.intent.action.MAIN" />  
    3.     <category android:name="android.intent.category.LAUNCHER" />  
    4. </intent-filter>  

    下再添加一个<intent-filter>

    1. <intent-filter>  
    2.     <action android:name="android.intent.action.VIEW" />  
    3.     <category android:name="android.intent.category.DEFAULT" />  
    4.     <category android:name="android.intent.category.BROWSABLE" />  
    5.     <data android:scheme="android" android:host="MainActivity" />   
    6. </intent-filter>  

    添加完毕后当我们再次运行模拟器。点击“打开”按钮,点击“启动Android”链接后我们发现我们的又回到了MainActivity注意我们是通过浏览器启动Activity。下面我们需要处理的就是获取请求的路径,也就是 android://MainActivity?id=coolszy。这时我们可以复写Activity种的onNewIntent()方法,不熟悉的朋友可以百度了解该方法。我们都知道Activity之间信息的传递时通过Intent对象,因此通过该方法中的Intent对象,我们可以获得请求的路径,最终获得请求的参数信息:

    1. @Override  
    2. protected void onNewIntent(Intent intent)  
    3. {  
    4.     Uri uri = intent.getData();  
    5.     if (null!=uri)  
    6.     {  
    7.         String url = uri.toString();  
    8.         Log.i(TAG, url);  
    9.         int index = url.lastIndexOf("=");  
    10.         if (index!=-1)  
    11.         {  
    12.             etParams.setText(url.substring(index+1));  
    13.         }  
    14.     }  
    15.     super.onNewIntent(intent);  
    16. }  

    注:如果想让该方法执行,我们需修改AndroidManifest.xml文件中MainActivity的配置,添加android:lauchMode属性:

    1. <activity android:name=".MainActivity"  
    2.                   android:label="@string/app_name"  
    3.                   android:launchMode="singleTask">  

    此时当我们再次运行模拟器。点击“打开”按钮,点击“启动Android”链接后我们发现我们的回到了MainActivity上,同时也得到了参数。

    我们在总结下这个实验:这个实验的主要目的是学习如何从浏览器种启动一个Activity,首先我们要给相关的Activity添加一个<intent-filter>,其次通过复写onNewIntent()方法得到返回信息,如果想要被onNewIntent()调用,我们还行给其Activity添加一个android:lauchMode属性。

    下面我们回归到本次主题,在OAuth认证第一步种有个oauth_callback参数,作用是认证成功后浏览器会被重定向到这个url中,如果我们url设置为http://www.baidu.com,则会定位到http://www.baidu.com,同样,如果我们把url设置为android://MainActivity,则会定位到android://MainActivity上,如果Activity再加上<intent-filter>,这时MainActivity就可以自动获取到验证码,而不需要我们手动的输入。

    首先,设置我们的oauth_callback参数:

    1. params.add(new Parameter("oauth_callback", encode("android://MainActivity")));  

    注:android://MainActivity之所以使用encode()是应为我在测试时发现当我们传递的url包含有“:”、“//”等符号会返回401错误,因此在这里进行encode()

    其次,修改AndroidManifest.xml文件中MainActivity配置:

    1. <activity android:name=".MainActivity"  
    2.           android:label="@string/app_name"  
    3.           android:launchMode="singleTask">  
    4.     <intent-filter>  
    5.         <action android:name="android.intent.action.MAIN" />  
    6.         <category android:name="android.intent.category.LAUNCHER" />  
    7.     </intent-filter>  
    8.     <intent-filter>  
    9.         <action android:name="android.intent.action.VIEW" />  
    10.         <category android:name="android.intent.category.DEFAULT" />  
    11.         <category android:name="android.intent.category.BROWSABLE" />  
    12.         <data android:scheme="android" android:host="MainActivity" />   
    13.     </intent-filter>  
    14. </activity>  

    同时给复写MainActivityonNewIntent()方法,用于接收传递过来的参数信息:

    1. @Override  
    2.     protected void onNewIntent(Intent intent)  
    3.     {  
    4.         super.onNewIntent(intent);  
    5.         Uri uri = intent.getData();  
    6.         String url = uri.toString();  
    7.         Log.i(TAG, url);  
    8.         int index = url.lastIndexOf("=");  
    9.         if (index!=-1)  
    10.         {  
    11.             txtVerifier.setText(url.substring(index+1));  
    12.         }  
    13.     }  

    至此我们的程序就能自动的获取验证码,而不需要用户手动的输入。

     

    课程下载地址:http://u.115.com/file/dn43kklr

    文档下载地址:http://download.csdn.net/source/3430433

    源码下载地址:http://u.115.com/file/aq2vc8m4

  • 相关阅读:
    JS 变量的作用域
    清理网站缓存的几种方法
    C# 将程序添加到启动项 (写入注册表),及从启动项中删除
    EasyUI iconCls
    JQuery Easy Ui dataGrid 数据表格
    datatable转换为json
    Web window.print() 打印
    用js使得输入框input只能输入数字
    隐藏或删除指定的html元素
    使用Asponse.Cell解决Excel科学计数法问题
  • 原文地址:https://www.cnblogs.com/xiaoxiaoboke/p/2116251.html
Copyright © 2020-2023  润新知