webview跳转第三方APP

2023-11-15

hello,又是我鑫鑫

--------------------------前言-------------------------

这吃给大家带来的博客是关于webview跳转第三方APP的

相信这个问题也为难过各位,那么话不多说,我直接上代码

----------------------------------------------------

MainActivity.java

这里的活动名我没有改,使用的话,将所有的Contact_Customer改为MainActivity即可

package com.mycompany.myapp2;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ClipData;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.webkit.DownloadListener;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.mycompany.myapp2.R;

import java.io.FileNotFoundException;
import java.net.URISyntaxException;
import java.util.List;

public class Contact_Customer extends Activity {

    
//声明相应ID
	private WebView webView;
    
    private Context context;

    private TextView tvTitle;

    private TextView tvProgress;


//这里定义所需要的变量
    private ValueCallback<Uri> uploadMessage;
    private ValueCallback<Uri[]> uploadMessageAboveL;
    private final static int FILE_CHOOSER_RESULT_CODE = 10000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.Contact_Customer);//绑定页面ID
		getActionBar().hide();
		
		//去除导航栏
        Window navigation = getWindow();
        navigation.getDecorView().setSystemUiVisibility(
			View.SYSTEM_UI_FLAG_LAYOUT_STABLE
			| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
			| View.SYSTEM_UI_FLAG_LOW_PROFILE
			| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
			| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
			| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
			| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

        context= this;


		getActionBar().hide();//去除标题栏

      
        //获取标题显示进度显示的布局ID
        final LinearLayout top = findViewById(R.id.top);
        //获得其他控件
        tvTitle = (TextView) findViewById(R.id.tv_title);
        // tvStart = (TextView) findViewById(R.id.tv_start);
        tvProgress = (TextView) findViewById(R.id.tv_progress);
        // tvEnd = (TextView) findViewById(R.id.tv_end);

        webView = (WebView) findViewById(R.id.Contact_Customer_web);//绑定网页布局ID


		WebSettings settings = webView.getSettings();//web一些设置
        settings.setJavaScriptEnabled(true);

		settings.setJavaScriptCanOpenWindowsAutomatically(true);
//         当网页需要保存数时据,设置下面属性
		settings.setDomStorageEnabled(true);

		//设置页面自适应 窗口大小改变后页面自适应改变
		settings.setUseWideViewPort(true);//设置为使用webview推荐的窗口,主要是为了配合下一个属性
		settings.setLoadWithOverviewMode(true);//设置网页自适应屏幕大小,该属性必须和上一属性配合使用

//        webSettings.setGeolocationEnabled(true); //启用还H5的地理定位服务
//         设置是否允许webview使用缩放的功能
		settings.setSupportZoom(true);
		settings.setBuiltInZoomControls(true);
		settings.setDisplayZoomControls(false); //隐藏webview缩放按钮

		settings.setAllowFileAccess(true);//支持上传文件
//         提高网页渲染的优先级
		settings.setRenderPriority(WebSettings.RenderPriority.HIGH);

        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不读取缓存
        // 加载指定网页
        
       // webView.loadUrl("https://qm.qq.com/cgi-bin/qm/qr?k=EWYf-_SRrmPF-f4xyYKQfNklEcHMsjVR&noverify=0");
            //跳转QQ---项目中我安装了一个APP,所以跳转成功
         webView.loadUrl("https://m.jumpwx.com/wx/?i=170");
             //跳转微信---项目中我并没有安装这个,所以他会提示无法跳转。
        
        

        webView.setWebViewClient(new WebViewClient(){
            //跳转第三方应用
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    
                    try {
                         if (!(url.startsWith("http") || url.startsWith("https"))) {
                        Intent intent = new Intent();
                        intent.setAction(Intent.ACTION_VIEW);
                        intent.setData(Uri.parse(url));
                        startActivity(intent);
                        return true;
                    }
                        view.loadUrl(url);
                        return true;
                    } catch (Exception e) {
                        // 防止没有安装的情况
                        e.printStackTrace();
                        Toast.makeText(Contact_Customer.this,"您所打开的第三方App未安装!",Toast.LENGTH_SHORT).show();
                    }
                    return true;
                }
                
                    
                
                
               
            });
            
      

        webView.setWebChromeClient(new WebChromeClient() {

            //文件上传
            
				// For Android < 3.0
				public void openFileChooser(ValueCallback<Uri> valueCallback) {
					uploadMessage = valueCallback;
					openImageChooserActivity();
				}

				// For Android  >= 3.0
				public void openFileChooser(ValueCallback valueCallback, String acceptType) {
					uploadMessage = valueCallback;
					openImageChooserActivity();
				}

				//For Android  >= 4.1
				public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
					uploadMessage = valueCallback;
					openImageChooserActivity();
				}

				// For Android >= 5.0
				@Override
				public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
					uploadMessageAboveL = filePathCallback;
					openImageChooserActivity();
					return true;
				}


                
    
                //获取网站标题
                @Override
                public void onReceivedTitle(WebView view, String title) {
                    tvTitle.setText(title);
                }
                //进度显示
                @Override
                public void onProgressChanged(WebView view, int newProgress) {
                    if (newProgress < 100) {
                        tvProgress.setText(newProgress + "%");
                    } else {
                        tvProgress.setText("100%");
                        top.setVisibility(View.GONE);
                    }
                }
     
    
                
        
                
			});







		//设置下载监听
        webView.setDownloadListener(new DownloadListener() {



				@Override
				public void onDownloadStart(final String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {

					new AlertDialog.Builder(Contact_Customer.this)
						.setTitle("信息提示")//设置对话框标题
						.setIcon(R.drawable.ic_launcher)
						.setMessage("下载将跳转浏览器,是否选择?")
						.setPositiveButton("是", new DialogInterface.OnClickListener() {//添加确定按钮

							@Override
							public void onClick(DialogInterface dialog, int which) {//确定按钮的响应事件

								Uri uri = Uri.parse(url);
								Intent intent = new Intent(Intent.ACTION_VIEW, uri);
								startActivity(intent);
							}
						}).setNegativeButton("否", new DialogInterface.OnClickListener() {//添加返回按钮

							@Override
							public void onClick(DialogInterface dialog, int which) {//响应事件

							}

						}).show();//在按键响应事件中显示此对话框
				}
			});

			
/*
		// 长按点击事件
		webView.setOnLongClickListener(new View.OnLongClickListener() {
				@Override
				public boolean onLongClick(View view) {
					final WebView.HitTestResult hitTestResult = webView.getHitTestResult();
					// 如果是图片类型或者是带有图片链接的类型
					if(hitTestResult.getType()== WebView.HitTestResult.IMAGE_TYPE||
					   hitTestResult.getType()== WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE){
						// 弹出保存图片的对话框
						AlertDialog.Builder builder = new AlertDialog.Builder(context);
						builder.setTitle("提示");
						builder.setMessage("保存图片到本地");
						builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
								@Override
								public void onClick(DialogInterface dialogInterface, int i) {
									String url = hitTestResult.getExtra();
									// 下载图片到本地
									DownPicUtil.downPic(url, new DownPicUtil.DownFinishListener(){

											@Override
											public void getDownPath(String s) {
												Toast.makeText(context,"下载完成",Toast.LENGTH_LONG).show();
												Message msg = Message.obtain();
												msg.obj=s;
												handler.sendMessage(msg);
											}
										});

								}
							});
						builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
								// 自动dismiss
								@Override
								public void onClick(DialogInterface dialogInterface, int i) {
								}
							});
						AlertDialog dialog = builder.create();
						dialog.show();
					}
					return true;
				}
			});
*/
    }




    /*文件上传*/
  
    //这里定义具体上传函数
    private void openImageChooserActivity() {
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        i.setType("*/*");
        startActivityForResult(Intent.createChooser(i, "选择文件"), FILE_CHOOSER_RESULT_CODE);

	}

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == FILE_CHOOSER_RESULT_CODE) {
            if (null == uploadMessage && null == uploadMessageAboveL) return;
            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
            if (uploadMessageAboveL != null) {
                onActivityResultAboveL(requestCode, resultCode, data);
            } else if (uploadMessage != null) {
                uploadMessage.onReceiveValue(result);
                uploadMessage = null;
            }
        }
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
        if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)
            return;
        Uri[] results = null;
        if (resultCode == Activity.RESULT_OK) {
            if (intent != null) {
                String dataString = intent.getDataString();
                ClipData clipData = intent.getClipData();
                if (clipData != null) {
                    results = new Uri[clipData.getItemCount()];
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        ClipData.Item item = clipData.getItemAt(i);
                        results[i] = item.getUri();
                    }
                }
                if (dataString != null)
                    results = new Uri[]{Uri.parse(dataString)};
            }
        }
        uploadMessageAboveL.onReceiveValue(results);
        uploadMessageAboveL = null;


    }


        /*图片文件的下载*/

    Handler handler =new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            String picFile = (String) msg.obj;
            String[] split = picFile.split("/");
            String fileName = split[split.length-1];
            try {
                MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), picFile, fileName, null);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            // 最后通知图库更新
            getApplicationContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + picFile)));
			//MyToast("图片保存图库成功", 1100);
		}
    };

    
    
    /*自定义Toast*/

    //具体见我自定义Toast的文章,这你就不写进去了
  /*  
	public void MyToast(String str, int showTime) {
        View view= LayoutInflater.from(this).inflate(R.layout.view_toast_custom,null);
        TextView tv_msg = (TextView) view.findViewById(R.id.tvToast);
        tv_msg.setText(str);
        Toast toast = new Toast(this);
        toast.setGravity(Gravity.BOTTOM|Gravity.CENTER, 0, 20);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.setView(view);
        toast.show();

    }*/


    /*返回键的监听*/
    // 监听返回键返回网页的上一层
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){
            if(webView != null){
                webView.goBack();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }




}

-----------------------说明------------------------

上面这个activity是跳转至微信小程序,而我并没有安装微信,所以他不提示以下的效果。

---------------------------------------------------------

如果换成安装了的APP,比如果:QQ

像我不仅有QQ还有TIM,所以他会弹出以下效果

---------------------------------------------------------

话不多说,继续上activity_main.xml

-----------------------------------------------------

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_height="match_parent"
	android:layout_width="match_parent"
	android:orientation="vertical"
	android:background="#FFFFFFFF">

	<LinearLayout
		android:id="@+id/top"
		android:layout_width="match_parent"
		android:layout_height="95dp"
		android:orientation="vertical"
		android:layout_marginTop="15dp"
		android:layout_weight="1.0"
		android:layout_marginBottom="3dp">

		<TextView
			android:id="@+id/tv_title"
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:text="获取标题"
			android:gravity="center"
			android:textStyle="bold"
			android:textColor="#FF000000"/>

		<LinearLayout
			android:layout_height="wrap_content"
			android:layout_width="match_parent">

			<TextView
				android:id="@+id/tv_progress"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:text="获取加载进度"
				android:layout_weight="1.0"
				android:textStyle="bold"
				android:textColor="#FF000000"
				android:gravity="center"/>

		</LinearLayout>

	</LinearLayout>

	<LinearLayout
		android:layout_height="match_parent"
		android:layout_width="match_parent"
		android:orientation="vertical"
		android:layout_weight="1.0">

		<WebView
			android:id="@+id/Contact_Customer_web"
			android:layout_width="match_parent"
			android:layout_height="match_parent"/>

	</LinearLayout>

</LinearLayout>

---------------------------------------------------------

从MainActivity一样,将所有的Contact_Customer改为MainActivity,或者在JAVA代码中你不要改webview的id,否则就要与xml中webview的ID样,不然会闪退。

---------------------------------------------------------

那基本也就是这样的,就到这里了吧。再见~

有任何问题在评论区问我哦~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webview跳转第三方APP 的相关文章

随机推荐

  • Mxnet在Windows10, vs2015平台的编译及开发-CPU版本

    环境 基础配置 Windows10 cmake3 11 1 vs2015 QT5 11 1 mxnet配置 OpenBLAS v0 2 9 Win64 int32 opencv3 4 1 相关资源百度云链接 https pan baidu
  • 机器学习——L1范数充当正则项,让模型获得稀疏解,解决过拟合问题

    问 使用L2范数正则项比L1范数正则项得到的是更为稀疏的解 答 错误 L1范数正则项得到的是更稀疏的解 因为在L1正则项中 惩罚项是每个参数绝对值之和 而在L2正则项中 惩罚项是每个参数平方的和 L1正则项可以压缩参数中的小值 更容易导致一
  • MongoDB wiredTiger存储引擎下的存储方式LSM和B-Tree比较

    前段时间做拦截件监控的时候把拦截件生命期存入mongodb 因生命期有各种变化 因此对此表的更新写操作非常多 老大给我看了一篇文章 才知道mongodb已经支持lsm存储方式了 原文如连接 https github com wiredtig
  • MongoDB安装时无法启动服务

    在安装MongoDB数据库的时候 有可能出现安装速度较慢 然后取消安装以后 再一次重新去安装的时候 在安装的最后一步可能会出现无法启动服务的现象 这种情况直接点击Ignore 完成安装以后 打开DOS窗口 使用该命令将MongDB服务删除掉
  • Qt UI 入门之QPushbutton

    Qt UI 入门之QPushbutton QPushbutton
  • 邻接表图,增加、删除、修改,功能齐全,有双权和有单权

    刚刚考完 纪念一下 虽说不是考试提交的最终代码 但是是我提前准备的考试源码 供给考试使用 这是单权 下面是双权的 include
  • linux jobs命令

    原文链接 http blog 163 com a7701 126 blog static 20821732201276231717 fg bg jobs ctrl z都是跟系统任务有关的 虽然现在基本上不怎么需要用到这些命令 但学会了也是很
  • AtCoder Beginner Contest 313

    A To Be Saikyo atcoder jp AC代码 include
  • Android EventBus收不到消息事件?又给自己挖坑了吧

    骚年 老给自己挖坑 该扇嘴巴子了 检查一下看是不是以下几种情况 没有register事件 事件类没对上号 比如导错包 接收事件的方法不是public 事件被优先级更高的拦截且中断了
  • 怎么将webm文件转换成MP4格式在手机上播放

    由于各品 不同型号的手机配置不同 手机支持的视频格式也可能不同 比较常见的就是视频格式转换 即将手机不支持播放的格式视频转换成手机支持的格式视频 手机最常用的格式是MP4 3GP 3G2等格式 所以我们只需将在电脑上下载的视频转换成这些适合
  • 想用Python做副业?看这一篇就够了

    大家好 我是耿直 随着人工智能 大数据 物联网的广泛应用 与之紧密关联的Python技术开始受到人们的极大关注 各行业对Python技术服务的需求量呈指数级暴增 尤以爬虫技术服务为甚 供不应求早已成为常态 而近两年受到各种不可抗力的影响 做
  • Linux(Centos7) 运行脚本程序,终端只返回 “已杀死”

    最近在实验室服务器上跑代码 没跑多久就显示 已杀死 而且只显示已杀死 没有任何其他打印和日志 1 确定不是代码的bug 2 网上搜了一大堆 全说是OOM的问题 就是代码消耗内存太多 被OOM killer杀死 但是我用的服务器内存确定充足
  • 百度地图marker点击切换icon以及上一个icon恢复原样

    var preMarker this map addEventListener click function e console log e if e overlay e overlay toString object Marker var
  • openresty+lua安装

    一 下载软件 下载ngx openresty xxx tar gz并解压 wget https openresty org download ngx openresty 1 9 7 1 tar gz ngx openresty xxx bu
  • 将包含children的数据解析构成iview的cascader或者树行需要的结构

    function convertTree rst const result 遍历 tree rst forEach item gt 解构赋值 let value value label label children children ite
  • 使用VS Code开发Arduino

    文章目录 目的 软件安装 快速使用 更多说明 编译输出时中文乱码 Arduino扩展配置说明 使用 arduino cli 总结 目的 Arduino官方的IDE作为编辑器的功能挺简陋的 用起来并不是很舒服 相比较之下用VS Code Vi
  • 面试官:说说TCP如何实现可靠传输

    今天来讲一下TCP是如何保证可靠传输的 这也是面试常问的一个题目 这个问题不单止能看出你是否真的了解TCP原理 更看出你是否有一个总结的能力 我们从三个部分来讲TCP是如何实现可靠传输的 滑动窗口 首先是讲TCP中的滑动窗口 它和TCP的可
  • 论文阅读: GeoNet: Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose(CVPR2018)

    CVPR2018 GeoNet Unsupervised Learning of Dense Depth Optical Flow and Camera Pose 提出了一个联合估计深度 光流和pose的网络 这是在left right c
  • Javascript设计模式-04-工厂模式

    Javascript设计模式 04 工厂模式 简单工厂 抽象工厂 简介 工厂模式定义一个用于创建对象的接口 这个接口由子类决定实例化哪一个类 该模式使一个类的实例化延迟到了子类 而子类可以重写接口方法以便创建的时候指定自己的对象类型 个人理
  • webview跳转第三方APP

    hello 又是我鑫鑫 前言 这吃给大家带来的博客是关于webview跳转第三方APP的 相信这个问题也为难过各位 那么话不多说 我直接上代码 MainActivity java 这里的活动名我没有改 使用的话 将所有的Contact Cu