WebView and H5 those things (=)

大家如果有兴趣可以看我的前一篇[WebView与H5那些事儿](http://blog.csdn.net/xufei5789651/article/details/69566985) 。 这次,在项目中遇到的问题:

scene one

A project of the company is all made with h5, and then displayed using android webview. I think this is a pretty good job. Later, all kinds of hard work... This time I encountered a problem with Alipay on the h5 page. The above picture:
Write picture description here
You can see that the URL starts with "alipays", because our webview cannot recognize this (only the beginning of http/https can be recognized) ), so we have to intercept this operation, that is, through the setWebViewClient() method of our webview, override the shouldOverrideUrlLoading(WebView view, String url) of the WebViewClient to intercept it.

solution:

if(url.contains("alipays://platformapi")){ 
    boolean visit = checkAliPayInstalled(mContext);  
    if(visit){   
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));  
       startActivity(intent);  
    }
} else {  
    view.loadUrl(url);  
}  

//判断是否安装支付宝app  
    public static boolean checkAliPayInstalled(Context context) {  
        Uri uri = Uri.parse ("alipays://platformapi/startApp");  
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
        ComponentName componentName = intent.resolveActivity(context.getPackageManager());  
        return componentName != null;  
    } 

Through the above method, when the custom url starts with alipays, the Alipay app on the mobile phone is called up. And when there is no Alipay app on the mobile phone, the Alipay login of h5 can be called up normally.

Scene two

The h5 page calls the interaction between the camera and the photo album, and you can read the notes I wrote about the Android, the camera, and the photo album . This time, the problem is that the native h5 obtains the image object (the image is Base64 encrypted) and then passes it to the php server to decrypt the image. The problem is that the encryption result is different.
The result of Base64 encryption in Android system is different from the result of PHP server encryption. Therefore, the picture cannot be decrypted on the php side. Reason: Because their default random number sequence is inconsistent, the solution to him is not to use the default creation method.
The following encryption methods can be used

public class Base64 {
    
      
    private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  
            .toCharArray();  

    public static String encode(byte[] data) {  
        int start = 0;  
        int len = data.length;  
        StringBuffer buf = new StringBuffer(data.length * 3 / 2);  

        int end = len - 3;  
        int i = start;  
        int n = 0;  

        while (i <= end) {  
            int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8)  
                    | (((int) data[i + 2]) & 0x0ff);  

            buf.append(legalChars[(d >> 18) & 63]);  
            buf.append(legalChars[(d >> 12) & 63]);  
            buf.append(legalChars[(d >> 6) & 63]);  
            buf.append(legalChars[d & 63]);  

            i += 3;  

            if (n++ >= 14) {  
                n = 0;  
                buf.append(" ");  
            }  
        }  

        if (i == start + len - 2) {  
            int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8);  

            buf.append(legalChars[(d >> 18) & 63]);  
            buf.append(legalChars[(d >> 12) & 63]);  
            buf.append(legalChars[(d >> 6) & 63]);  
            buf.append("=");  
        } else if (i == start + len - 1) {  
            int d = (((int) data[i]) & 0x0ff) << 16;  

            buf.append(legalChars[(d >> 18) & 63]);  
            buf.append(legalChars[(d >> 12) & 63]);  
            buf.append("==");  
        }  

        return buf.toString();  
    }  

    private static int decode(char c) {  
        if (c >= 'A' && c <= 'Z')  
            return ((int) c) - 65;  
        else if (c >= 'a' && c <= 'z')  
            return ((int) c) - 97 + 26;  
        else if (c >= '0' && c <= '9')  
            return ((int) c) - 48 + 26 + 26;  
        else  
            switch (c) {  
            case '+':  
                return 62;  
            case '/':  
                return 63;  
            case '=':  
                return 0;  
            default:  
                throw new RuntimeException("unexpected code: " + c);  
            }  
    }  

    /** 
     * Decodes the given Base64 encoded String to a new byte array. The byte 
     * array holding the decoded data is returned. 
     */  

    public static byte[] decode(String s) {  

        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
        try {  
            decode(s, bos);  
        } catch (IOException e) {  
            throw new RuntimeException();  
        }  
        byte[] decodedBytes = bos.toByteArray();  
        try {  
            bos.close();  
            bos = null;  
        } catch (IOException ex) {  
            System.err.println("Error while decoding BASE64: " + ex.toString());  
        }  
        return decodedBytes;  
    }  

    private static void decode(String s, OutputStream os) throws IOException {  
        int i = 0;  

        int len = s.length();  

        while (true) {  
            while (i < len && s.charAt(i) <= ' ')  
                i++;  

            if (i == len)  
                break;  

            int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6)  
                    + (decode(s.charAt(i + 3)));  

            os.write((tri >> 16) & 255);  
            if (s.charAt(i + 2) == '=')  
                break;  
            os.write((tri >> 8) & 255);  
            if (s.charAt(i + 3) == '=')  
                break;  
            os.write(tri & 255);  

            i += 4;  
        }  
    }  

}  

Guess you like

Origin blog.csdn.net/xufei5789651/article/details/76407875