通过浏览器url网址打开安卓app

目前要实现这个通过浏览器网页地址打开app好像都需要通过按钮手动触发才行,做自动跳转我没成功。安卓端的AndroidManifest.xml需要进行相关配置。

一、新建一个HTML用于打开调用打开安卓app。

其实html端很简单核心只需要一句话就行,其他html代码只是备忘用的。

<a href="urlopen://ranjuan/card?card_id=828&name=染卷">打开App </a>

<!DOCTYPE html>  
<html>  
<head>
<style>
    a{ font-size:80px;}
</style>

</head>
<body>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

<span id="device"></span>
<br>
 <a  id="opentest" href="scheme://host/card?card_id=828&name=bluess">打开随便App</a>
 <br>
 <a  id="opentest2" href="urlopen://ranjuan/card?card_id=828&name=染卷">打开App</a>
 <br>
 <a  id="opentest3" href="urlopen://ranjuanpage/card?card_id=828&name=bluess">打开App子页面</a>
 <br>
  <a href="javascript:open_or_download_app();">打开APP(带超时)</a>

<br>使用Intent-based URl方法打开安卓app
   <div>
      <a href=" intent://ranjuan#Intent;scheme=urlopen;action=android.intent.action.VIEW;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;component=ranjuan/.MainActivity;S.load_url=ranjuan;end">打开app方法二</a>
      <br>
      <a href=" intent://ranjuan/card?card_id=829998&name=bluess#Intent;scheme=urlopen;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;end">打开app方法2</a>
       <br>
      <a href=" intent://ranjuan/card?card_id=829998&name=bluess&billss=9#Intent;scheme=urlopen;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;end">打开app方法3</a>
      </div> 
  
  <p id="mod_pop" style="display:none;">请在其他浏览器中打开</p>
</body>  
<!-- https://blog.csdn.net/qidingquan/article/details/81330489 -->
<script>
function isWeixin() {
                var ua = navigator.userAgent.toLowerCase(); //获取判断用的对象
                if (ua.match(/MicroMessenger/i) == "micromessenger") {
                    return true; //微信打开
                } else {
                    return false; //不是微信打开
                }
            }

 if (isWeixin()) {
                    var modPop = document.getElementById('mod_pop');
                    modPop.style.display = "block";
                }


    try{
	var ua = navigator.userAgent.toLowerCase();
	//判断是否为移动终端
	var ismobile = !!ua.match(/AppleWebKit.*Mobile.*/);
	
	var reg_str = new RegExp(/AppleWebKit.*Mobile.*/, 'i');
     ismobile = !!ua.match(reg_str);
	 ismobile = false;
	//alert(ua);
	if(ismobile){
	   // alert('shi shouji');
		//不在微信内置浏览器中时执行
		if (!(ua.indexOf("MicroMessenger") > 0 || ua.match(/MicroMessenger/i) == "micromessenger")) {        
		        
		        var appinfo = "urlopen://ranjuan/card?card_id=828&name=染卷";
			//拼接唤醒APP参数ichsy_key=2表示APP中打开web页面,注意专题页只能有一个参数
			if(window.location.href.indexOf("&")==-1){
				//兼容5.2.8以前版本
				appinfo += encodeURIComponent("ichsy_key=2&ichsy_value=" + window.location.href);	
			}else{
				//多参数时
				appinfo += encodeURIComponent("ichsy_key=5&ichsy_value=" + Base64.base64encode(window.location.href))
			}
			 window.location.href = appinfo;
		 } 
	 }	        
 }catch(e){}
 
</script>
<script>

     function open_or_download_app() {
        var device = document.getElementById("device");
        if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {
            device.innerHTML = "ios设备";
            // 判断useragent,当前设备为ios设备
            var loadDateTime = new Date();
          // 设置时间阈值,在规定时间里面没有打开对应App的话,直接去App store进行下载。
            window.setTimeout(function() {
                var timeOutDateTime = new Date();
                if (timeOutDateTime - loadDateTime <2200) {
                    window.location = "http://www.baidu.com/s=ios";  // APP下载地址
                } else {
                    window.close();
                }
            },2000);
             window.location = "urlopen://ranjuan";  //ios端URL Schema
        } else if (navigator.userAgent.match(/android/i)) {
            device.innerHTML = "Android设备";
            // 判断useragent,当前设备为Android设备
            // 判断useragent,当前设备为ios设备
           console.log('is android');

           // window.location = ww"apptest://appteswwwt";  // Android端URL Schema 
            var appurl = "urlopen://ranjuan/card?card_id=828&name=染卷";
            //拼接唤醒APP参数ichsy_key=2表示APP中打开web页面,注意专题页只能有一个参数
			if(window.location.href.indexOf("&")==-1){
				//兼容5.2.8以前版本
				appurl += encodeURIComponent("ichsy_key=2&ichsy_value=" + window.location.href);	
			}else{
				//多参数时
				appurl += encodeURIComponent("ichsy_key=5&ichsy_value=" + Base64.base64encode(window.location.href))
			}
			 window.location = appurl;
			 console.log(appurl);
			 
			  var loadDateTime = new Date();
          // 设置时间阈值,在规定时间里面没有打开对应App的话,直接去App store进行下载。
            window.setTimeout(function() {
                var timeOutDateTime = new Date();
                if (timeOutDateTime - loadDateTime < 2200) {
                    //window.location.href = appurl;
                    alert('去下载app');
                    window.location = "http://www.baidu.com/s=99";   // APP下载地址
                } else {
                    window.close();
                }
            },2000);
        } 
    } 
    
</script>
</html>

二、修改AndroidManifest.xml中你想要通过url打开的activity的intent-filter配置

注意其中android:scheme="urlopen"与android:host="ranjuan"是与你在html代码中写的a标签保持一致

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:scheme="urlopen"
                    android:host="ranjuan" />

            </intent-filter>
        </activity>

        <activity
            android:name=".SkipActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data
                android:scheme="urlopen"
                android:path="/card"
                android:host="ranjuanpage" />

        </intent-filter>

        </activity>

    </application>
</manifest>

三、接收通过浏览器唤起app时传递过来的参数

在刚才的android:name=".MainActivity"对应的MainActivity.java文件中进行参数接收。

可能需要先引入相关包,然后在onCreate里面接收参数

import android.content.Intent;
import android.net.Uri;
import android.util.Log;

参考的MainActivity.java代码(有点凌乱,原谅我的不整理):

package com.ranjuan.testwin;

import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.google.android.material.bottomnavigation.BottomNavigationView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import android.content.Intent;
import android.net.Uri;
import android.util.Log;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_main);
        BottomNavigationView navView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(navView, navController);

        //获得控件
        WebView webView = (WebView) findViewById(R.id.webView);
        //访问网页
        webView.loadUrl("https://ranjuan.cn");
        //系统默认会通过手机浏览器打开网页,为了能够直接通过WebView显示网页,则必须设置
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //使用WebView加载显示url
                view.loadUrl(url);
                //返回true
                return true;
                //return false;
            }
        });
        //webView.getSettings().setJavaScriptEnabled(true);
        //webView.loadUrl("loadUrl");


        Intent intent=getIntent();
        //Log.d("test",intent.toURI());
        Log.d("test",intent.toString());
        Log.e("aaaaaaa","9xx999");
        Uri uri=intent.getData();

        if(uri!=null){
          try {
            String name=uri.getQueryParameter("name");
            Log.e("LOG NAME:",name);
            TextView textView =  findViewById(R.id.textView);
            textView.setText("地址:"+uri.toString()+"姓名"+name);
            //textView.setText(s);
          }
            catch(Exception e){
                TextView textView = findViewById(R.id.textView);
                textView.setText("获取异常,没有得到想要的东西");
            }
           //打开指定 activity
          //  Intent myintent = new Intent(MainActivity.this,SkipActivity.class);
          //  startActivity(myintent); // 启动目的Activity
        }
        }
        //Uri uri = getIntent().getData();
        //String test1= uri.getQueryParameter("arg0");
        //String test2= uri.getQueryParameter("arg1");

}

自此通过浏览器地址直接打开安卓app的操作已经结束,下面的内容主要为个人备忘使用,不看也没关系!

另外activity_main.xml文件,因为是测试是随机弄的控件也就顾不上什么界面效果了,有需要的可以看下。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="?attr/actionBarSize">

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@id/nav_view"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0"
        app:navGraph="@navigation/mobile_navigation" />

    <TextView
        android:id="@+id/textView0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="68dp"
        android:layout_marginLeft="68dp"
        android:layout_marginTop="128dp"
        android:text="@string/textview"
        android:textSize="8sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="168dp"
        android:layout_marginRight="168dp"
        android:layout_marginBottom="1dp"
        android:lineSpacingExtra="8sp"
        android:onClick="@string/textview"
        android:text="@string/textview0"
        android:textColor="#E91E63"
        android:textSize="12sp"
        app:layout_constraintBottom_toTopOf="@+id/webView"
        app:layout_constraintEnd_toEndOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="160dp"
        android:layout_marginLeft="160dp"
        android:layout_marginBottom="128dp"
        android:text="@string/button"
        android:textSize="24sp"
        app:layout_constraintBottom_toTopOf="@+id/nav_view"
        app:layout_constraintStart_toStartOf="parent" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="2dp"
        android:layout_marginBottom="1dp"
        android:contentDescription="TODO"
        app:layout_constraintBottom_toTopOf="@+id/webView"
        app:layout_constraintEnd_toEndOf="parent"
        app:srcCompat="@drawable/ic_launcher_background" />

    <WebView
        android:id="@+id/webView"
        android:layout_width="324dp"
        android:layout_height="226dp"
        android:layout_marginEnd="44dp"
        android:layout_marginRight="44dp"
        android:layout_marginBottom=".5dp"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent">

    </WebView>

</androidx.constraintlayout.widget.ConstraintLayout>

strings.xml文件内容

<resources>
    <string name="app_name">testwin</string>
    <string name="title_home">Home2</string>
    <string name="title_dashboard">Dashboard</string>
    <string name="title_notifications">Notifications</string>
    <string name="textview0">限返满50减20</string>
    <string name="textview">TextView99999</string>
    <string name="button">测试</string>
</resources>

其他参考教程:

1、https://www.jianshu.com/p/5685b4a1b77e

2、https://blog.csdn.net/ydyww/article/details/81077768

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/url-open-android-app/

赞赏

微信赞赏支付宝赞赏

发表评论