1. 程式人生 > >App跳轉到與手機版QQ公眾服務號聊天介面會話異常

App跳轉到與手機版QQ公眾服務號聊天介面會話異常

最近在專案中整合一個智慧客服的SDK,實現App的智慧諮詢,應需求拋棄原生的轉人工(即第三方客服平臺的人工服務應該要收費什麼的),改為直接轉到公司公眾號,實現微信、網站、Android的統一。
錯誤描述
雖然跳轉到了QQ,但並沒有顯示出QQ號碼對應的公眾號,而是一個獨立的普通QQ,傳送訊息失敗。
這裡寫圖片描述
這裡寫圖片描述
實現程式碼

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if
(isQQClientAvailable(MainActivity.this)){ String url = "mqqwpa://im/chat?chat_type=crm&uin=800095555&version=1&src_type=web&web_src=http:://wpa.b.qq.com"; startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); }else{ Toast.makeText(MainActivity.this
, "您的手機暫未安裝QQ客戶端", Toast.LENGTH_SHORT).show(); } } }); } /** * 判斷qq是否可用 * @param context * @return */ public static boolean isQQClientAvailable(Context context) { final PackageManager packageManager = context.getPackageManager(); List<PackageInfo> pinfo = packageManager.getInstalledPackages(0
); if (pinfo != null) { for (int i = 0; i < pinfo.size(); i++) { String pn = pinfo.get(i).packageName; if (pn.equals("com.tencent.mobileqq")) { return true; } } } return false; }

實現思路:對應的URL可以在騰訊開發平臺檢視,點選跳轉到QQ。
問題原因:我是百度的,說的不對請指正,從app請求某些公眾號跳轉到QQ客戶端,UID使用者身份證明(User Identification)會發生變化,與對應的QQ號碼不一致
參考部落格:http://blog.csdn.net/jamy2015/article/details/51188509
我用某些公眾號 是因為我使用的是800開頭的,但還是發生了這種錯誤。
解決辦法
既然知道是因為UID發生了變化,我們就應該找到正確的UID再來請求
參考部落格:http://blog.csdn.net/jyqj123/article/details/51171122
程式碼實現

webView = (WebView) findViewById(R.id.webview);
        webView.loadUrl("http://wpa.b.qq.com/cgi/wpa.php?ln=2&uin=4008205555");
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        //設定可自由縮放網頁
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                Log.i("TTT", url);
                return true;
            }
        });

得到URL
這裡寫圖片描述
這時候我們把原來的UID換成URL中的UID,再次實現跳轉。(記住網路許可權的新增)
最終效果圖
這裡寫圖片描述

bingo!!!填了一小坑,記錄一下
最後附上所有程式碼

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private Button button;
    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        webView = (WebView) findViewById(R.id.webview);
        webView.loadUrl("http://wpa.b.qq.com/cgi/wpa.php?ln=2&uin=4008205555");
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        //設定可自由縮放網頁
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                Log.i("TTT", url);
                return true;
            }
        });
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isQQClientAvailable(MainActivity.this)){
                    String url = "mqqwpa://im/chat?chat_type=crm&uin=800095555&version=1&src_type=web&web_src=http:://wpa.b.qq.com";
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                }else{
                    Toast.makeText(MainActivity.this, "您的手機暫未安裝QQ客戶端", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
    /**
     * 判斷qq是否可用
     * @param context
     * @return
     */
    public static boolean isQQClientAvailable(Context context) {
        final PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
        if (pinfo != null) {
            for (int i = 0; i < pinfo.size(); i++) {
                String pn = pinfo.get(i).packageName;
                if (pn.equals("com.tencent.mobileqq")) {
                    return true;
                }
            }
        }
        return false;
    }
}