精华内容
下载资源
问答
  • 提交注册代表您已阅读并同意用户协议、隐私政策、策略会员订阅协议"; SpannableString spannableString = new SpannableString(textProtocol); spannableString.setSpan(new ForegroundColorSpan...
    
            String textProtocol = "提交注册代表您已阅读并同意用户协议、隐私政策、策略会员订阅协议";
    
            SpannableString spannableString = new SpannableString(textProtocol);
            spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.need_active_text_color)), textProtocol.indexOf("同意") + 2, textProtocol.indexOf("、隐私") , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannableString.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(mActivity, H5WebViewActivity.class);
                    intent.putExtra("link", ApiConfig.API_USER_AGREEMENT);
                    startActivity(intent);
                }
    
                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setColor(getResources().getColor(R.color.fx_sliding_select_color));
                    ds.setUnderlineText(false);
                }
            }, textProtocol.indexOf("同意") + 2, textProtocol.indexOf("、隐私") , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    
    
            spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.need_active_text_color)), textProtocol.indexOf("户协议、") + 4, textProtocol.indexOf("、策略") , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannableString.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(mActivity, H5WebViewActivity.class);
                    intent.putExtra("link", ApiConfig.API_USER_PIVACY_POLICY);
                    startActivity(intent);
                }
    
                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setColor(getResources().getColor(R.color.fx_sliding_select_color));
                    ds.setUnderlineText(false);
                }
            }, textProtocol.indexOf("户协议、") + 4, textProtocol.indexOf("、策略") , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    
    
    
            spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.need_active_text_color)), textProtocol.indexOf("政策、") + 3, textProtocol.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannableString.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(mActivity, H5WebViewActivity.class);
                    intent.putExtra("link", ApiConfig.STRATEGIC_MEMBERSHIP_SUBSCRIPTION_AGREEMENT);
                    startActivity(intent);
                }
    
                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    ds.setColor(getResources().getColor(R.color.fx_sliding_select_color));
                    ds.setUnderlineText(false);
                }
            }, textProtocol.indexOf("政策、") +3, textProtocol.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    
            tvProtocol.setText(spannableString);
            tvProtocol.setMovementMethod(LinkMovementMethod.getInstance())

     

    展开全文
  •  android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制...

    一: Scheme协议完成外部链接跳转app指定页面

    什么是 URL Scheme?

        android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。

    URL Scheme应用场景:

        客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如商品详情页、活动详情页等等。也可以执行某些指定动作,如完成支付等。也可以在应用内通过 html 页来直接调用显示 app 内的某个页面。综上URL Scheme使用场景大致分以下几种:

    • 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
    • H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
    • APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
    • APP根据URL跳转到另外一个APP指定页面

    URL Scheme协议格式:

       先来个完整的URL Scheme协议格式:

    xl://goods:8888/goodsDetail?goodsId=10011002

    通过上面的路径 Scheme、Host、port、path、query全部包含,基本上平时使用路径就是这样子的。

    • xl代表该Scheme 协议名称
    • goods代表Scheme作用于哪个地址域
    • goodsDetail代表Scheme指定的页面
    • goodsId代表传递的参数
    • 8888代表该路径的端口号

    URL Scheme如何使用:

     1.)在AndroidManifest.xml中对<activity />标签增加<intent-filter />设置Scheme

     <activity
                android:name=".GoodsDetailActivity"
                android:theme="@style/AppTheme">
                <!--要想在别的App上能成功调起App,必须添加intent过滤器-->
                <intent-filter>
                    <!--协议部分,随便设置-->
                    <data android:scheme="xl" android:host="goods" android:path="/goodsDetail" android:port="8888"/>
                    <!--下面这几行也必须得设置-->
                    <category android:name="android.intent.category.DEFAULT"/>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.BROWSABLE"/>
                </intent-filter>
            </activity>

    2.)获取Scheme跳转的参数

    Intent i_getvalue = getIntent();
    String action = i_getvalue.getAction();
    if(Intent.ACTION_VIEW.equals(action)){

    Uri uri = i_getvalue.getData();
    if (uri != null) {
    
    // 完整的url信息 String url = uri.toString(); Log.e(TAG, "url: " + uri); // scheme部分 String scheme = uri.getScheme(); Log.e(TAG, "scheme: " + scheme); // host部分 String host = uri.getHost(); Log.e(TAG, "host: " + host); //port部分 int port = uri.getPort(); Log.e(TAG, "host: " + port); // 访问路劲 String path = uri.getPath(); Log.e(TAG, "path: " + path); List<String> pathSegments = uri.getPathSegments(); // Query部分 String query = uri.getQuery(); Log.e(TAG, "query: " + query); //获取指定参数值 String goodsId = uri.getQueryParameter("goodsId"); Log.e(TAG, "goodsId: " + goodsId);}
    }

    3.)调用方式

    网页上

    <a href="xl://goods:8888/goodsDetail?goodsId=10011002">打开商品详情</a>

     4.)如何判断一个Scheme是否有效

    PackageManager packageManager = getPackageManager();
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    boolean isValid = !activities.isEmpty();
    if (isValid) {
        startActivity(intent);
    }




    二:JS和安卓互相调用
    下面上代码:(js_webView.html)

    html里面的代码也比较简单,整个html中就一个Button,点击这个Button的时候去执行javascript中的 jsCallAndroid() 方法。

    网页中有关 javascript 的代码也比较简单,整个 js 就2个方法,一个是 jsCallAndroid() ,一个是 androidCallJs() 。看方法名就知道了,分别是 js 调用 Android 的和 Android 调用 js 的。

    先不要去管 jsCallAndroid() 里面做的是什么,待会会解释,来看看 androidCallJs() 这个方法里面做的就是弹出一个信息提示框,具体提示什么信息都不重要了,随便。

    再来看看代码部分(WebViewActivity的布局文件):


    整个布局文件也很简单,一个按钮和一个WebView,按钮是用来测试 Android 调用 js 用的,js 调用 Android 就当然是 webview 加载的网页里面的按钮了。

    再来看看 Java 代码部分(WebViewActivity):


    下面来看看代码部分:

    37-42行:这几行就是android中的按钮的点击事件,没什么好解释的,来看看点击事件做的是什么?点击事件做的是:调用 webview 的 loadurl 方法去调用 js 中的方法;调用的方式是:前面是 javascript 中间用 : 分隔 最后是 要调用的 js 的方法名。

    45-55行:这几行就是有关于 Webview 的设置等,46-51 这几行是指支持弹窗,也就是支持 html 网页弹框,因为前面的 html 代码中,有我们 Android 调用 js 的时候,调用成功就 js 弹窗,所以这里要加上这个设置。接下来是53行,53行指的是支持 javascript 这里指的是支持 html 中的 javascript 解析,不管是不是 js 和 Android 交互,只要网页中含有 js ,都要。最关键的就是54行,54行就是 javascript 和 Android 交互的了,addJavascriptInterface 方法需要接受两个参数,第一个是与之相对应的 js 调用 Android 本地的类的对象,这个例子中的就是58-63行这个类的对象,第二个参数就是和前面网页中的js代码中的 jsCallAndroid 方法中的 wv.sayHello(),这里的 wv 就和这个参数(wv)与之相对应,而 sayHello() 就是对应的第一个参数的对象里面的方法。

    最后是58-63行,这几行没什么好解释的了,只是如果调用成功就打印一行日志。仅此检验是否调用成功而已。

    整个 demo 代码到此完毕,好激动,赶紧运行试试看。

     

    运行的结果会让很多人失望,只是android调用js成功了,但 js 调用 android 不成功。

     

    这是为什么呢?这里要涉及到的是有关于 webview 和 js 的安全性的问题。js 可以通过这种方式下载恶意代码在 android 上执行,具体有兴趣的可以去 Google 一下,所以上面这种写法只是对于 Api16以前的android手机是适用的,16以后,谷歌对这个安全性问题进行了修复。将其注解到android自带的一个javascriptInterfface类中。下面就来看看16以后的写法是咋样的?


    有了注解,简直如虎添翼,非常方便。还是原来的配方,还是原来的味道,原汁原味。除了 Activity 中的代码需要修改,其他都不动。

    改动的代码有55行,直接传一个 this(Context) 对象就可以了,那么,原来的 JsInterface 就可以不要了。不要那我 sayHello 方法写到哪里呢?既然你传递的是 this ,当然是写到 this 里面咯(59-62行)。不同的是,这个 sayHello() 方法必须加上一个 JavascriptInterface 的注解。

     

    OK了,16以前和16以后的都有了,不就OK了么。在添加javascript的时候判断一下 Api 版本就可以了,哈哈。。。

     

    不不不,肯定不是这样子做。指需要在onCreate() 方法上添加 @SuppressLint("JavascriptInterface") 注解即可。

    看下面的就是终极代码了。


    对,没错,就是这样子。大功告成。

    最后需要提一点的是,上面的例子是可以执行,正常情况下都没什么问题,但你看看网上的demo,很多在 android 调用 js 的时候是开一个子线程去调用,没错,实际开发中,是必须要这样子做的。好处就不言而喻了。这一点看最后一张代码图,这里也有给出,直接调用webview的post,里面就是 Android 调用 js 了。


    展开全文
  • 协议跳转当我们在应用中点击一个协议链接,通常会提示我们选择合适的浏览器或者app去打开它。如上,定义后 , 安卓上打开web链接: http://www.stone86.top/magic 可以匹配到 该 MainActivityscheme可以随意设置。...

    协议跳转

    当我们在应用中点击一个协议链接,通常会提示我们选择合适的浏览器或者app去打开它。

    如上,定义后 , 安卓上打开web链接: http://www.stone86.top/magic 可以匹配到 该 MainActivity

    scheme可以随意设置。访问形式还是跟上面类似的: scheme://host/pathPatteren

    只是在6.0以后多了一个默认处理。

    使app作为给定链接的默认处理者

    要想实现Android 6.0 中的”让app作为对给定类型链接的默认处理者”。要再增加如下配置:

    android:autoVerify="true" 自动会访问该站点进行验证。为了自动验证,向阿里云申请了一天的https+cdn来测试,实际访问的是:https://www.stone86.top/.well-known/assetlinks.json。 该验证服务必须是https的站点;实际测试时,明明站点的json是可以访问的,但验证还是没通过,猜想,可能是国内服务器的问题

    文件夹名必须是.well-known,文件名为assetlinks.json,内容是:

    [{

    "relation": ["delegate_permission/common.handle_all_urls"],

    "target": { "namespace": "android_app", "package_name": "com.stone.mvp", "sha256_cert_fingerprints": ["81:6D:ED:45:12:AE:0D:89:04:CC:5F:DB:E6:BB:62:31:64:4A:14:4D:54:9B:CA:48:95:33:C6:AF:F3:3D:4A:6F"]}}]

    可以使用java的keytool命令来获取fingerprints:$ keytool -list -v -keystore my-release-key.keystore。

    当app运行,验证通过后;再打开该链接,就会查找到系统中,已配置了其对应的app,就不会弹出其它可接受网页category的应用选择框了;会直接打开app。

    使用命令验证绑定情况

    adb shell am start -a android.intent.action.VIEW \

    -c android.intent.category.BROWSABLE \

    -d "http://www.stone86.top/magic" "com.stone.mvp"

    当不含后面的package值时,还是会弹出多app选择框。因为验证可能失败了。

    测试网站与url的绑定命令:

    adb shell dumpsys package domain-preferred-apps

    输出:

    Package: com.google.android.calendar

    Domains: www.google.com calendar.google.com

    Status: undefined //未明确定义

    Package: com.stone.mvp

    Domains: stone86.top www.stone86.top

    Status: ask //询问

    Package: com.google.android.youtube

    Domains: youtu.be m.youtube.com youtube.com www.youtube.com

    Status: always : 200000001 //有always,表示是 成功

    代码中应用

    用intent,匹配协议,打开App:

    String url = "http://stone86.top/magic?key=stone"; //这里加了 ?key参数

    Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

    in.setPackage("com.stone.mvp"); //没有这句可能会有选择框,看验证的绑定情况;反之,有就能直接打开

    startActivity(in);

    activity中,解析:

    val queryParameter = intent?.data?.getQueryParameter("key")

    if (queryParameter != null) { println("stone.stone queryParameter=" + queryParameter) }

    webview跳转App:

    String url = "http://stone86.top/magic?key=stone";

    WebView view = new WebView(this);

    view.loadUrl(url); //可能会有选择框,看验证的绑定情况

    Android Studio 3.0中操作App Links

    AS3.0 , 菜单栏 Tools > App Links Assistant 可以快速操作 App Links

    展开全文
  • 之前发过一篇《通过Url Scheme协议打开APP界面》,讲了一些快速跳转到app某个页面的方法,然后有人问我这些scheme url 怎么获取到的。实话实说,我不知道怎么得到,因为我不懂app反编译,我所分享的这些url都是通过...

    之前发过一篇《通过Url Scheme协议打开APP界面》,讲了一些快速跳转到app某个页面的方法,然后有人问我这些scheme url 怎么获取到的。

    实话实说,我不知道怎么得到,因为我不懂app反编译,我所分享的这些url都是通过百度搜索到的,当然包括今天这个抖音跳转的案例。

    前两天群友问我,有没有抖音个人主页的跳转地址,因为不知道当时就回复了一句没有。那今天在搜索别的内容的时候,正巧看到了,所以拿来做个分享。

    snssdk1128://user/profile/id号

    这个就是抖音跳转个人主页的url,里面说的id号不是抖音号,id获取方法是通过分享主页,得到链接。

    5c2c4912c338d84960535c1997de4ce4.png

    当然得到链接http://v.douyin.com/5J7nnM/这是一个短连接,当中也没有id号,需要放到浏览器里面打开,然后就可以展开长连接了。

    https://www.iesdouyin.com/share/user/3733569708763603?u_code=lg1gga6f&sec_uid=MS4wLjABAAAA7sTcGnYEpBP_Z9vUa1OSYhVimWF5JtEE0vDnVT65NE0SsZf5aEF_Rf_DlWm_VJp2&timestamp=1567584952

    这里面3733569708763603就是id号。

    跳转代码如下:

    Import "shanhai.lua"

    shanhai.execute("am start -a android.intent.action.VIEW -d snssdk1128://user/profile/3733569708763603")

    后期我按照snssdk1128://去搜索,又找到了跳转指定作品的scheme url地址,snssdk1128://aweme/detail/作品id号。

    这里作品id的获取,同id号类似,也是通过分享复制链接,然后放入浏览器把短连接变成长连接。

    Import "shanhai.lua"

    shanhai.execute("am start -a android.intent.action.VIEW -d snssdk1128://aweme/detail/6724587732426968328")

    本期教程就这些内容,以后找到其他scheme url再分享给大家。

    展开全文
  • 比如第三方登录,微信或者支付宝支付,就需要用到应用间跳转的技术,做过的可能知道我们需要配置一个URL Schemes:其实这个URL Schemes就是应用间的一个通讯协议,如同http协议一样。举个栗子:"...
  • 由迈普视通精心研发的Creator R5播控软件2.1 MAC版本正式发布;与现有2.0版本对比,新增加了8个功能和优化了4个功能,在功能上有更好的提升,欢迎各位朋友下载体验。...新增OSC协议控制、ArtNet协议控制7.新增自...
  • 通用协议跳转,这个是开发用于快速调试的,然后被我给发现,可以用于自动化,就是通过安卓的广播+app接收,进行不同页面的跳转,简单的说,原本,我们要进入D页面,我们需要点击A,B,C,D,而现在通过路由跳转,直接...
  • 自己没做过这样的需求,在网上查找,使用Url Scheme协议实现浏览器跳转app指定页面,网上的例子很多,但是都比较简单,例子也很简单,但是放在项目里面就出现了各种问题,因为只是单纯的一个例子,没有考虑各种情况...
  • 安卓学习笔记整理

    2021-01-08 14:23:29
    scheme跳转协议通过注册scheme可在App页面内跳转,从H5页面跳转到App,从一个App跳转到另一个App service启动方式startService()步骤:定义一个类继承Service,注册Service,使用Context的startService(Intent)方法...
  • 利用意图对象实现安卓窗体之间的跳转和参数传递及参数回传,使用http协议实现web接口调用(包含接口的开发功能),通过自定义数据适配器,使用post和get方式请求网络数据,实现带商品图片数据列表展示和商品明细查看...
  • 如果不考虑屏蔽,跳转APP的方式主要有:url scheme这是一种ios与Android都支持的叫做schema的协议。至于具体怎么设置,交给IOS或者安卓开发人员吧。这种方式在除微信外的大部分浏览器都是支持的。首先,微信内置的...
  • android中的scheme协议

    2020-01-31 21:59:12
    Android中的是Scheme是一种页面的跳转协议,主要用于以下场景: 服务器下发:服务端通过自定义的字段下发至APP,APP通过解析该字段,跳转至相应的界面; H5跳转:通过H5的操作界面,跳转至安卓的原生界面中; ...
  • H5跳转APP

    2021-01-18 09:45:41
    // 微信内 if(isWeixin) { alert('请在浏览器上打开') } else { //android端 if (isAndroid) { //安卓app的scheme协议 window.l...
  • Scheme跳转协议是一个可以直接跳转到APP的某个页面的协议,每个常见的app都有自己的Scheme跳转协议,关于Scheme协议我也是一知半解,这篇文章主要是和大家分享一些我整理的Scheme跳转协议以及怎么通过按键精灵跳转。...
  • 各位朋友,大家好: 我是安卓开发者SGY,这是我写的第一篇博客,主要对安卓开发面试... 一、关于Activity 关于Activity必须要了解的内容有:Activity的生命周期、android任务栈、Activity启动模式、scheme跳转协议。...
  • 交互-前端跳转原生App

    2019-04-28 14:22:58
    actuive 是APP与前端的一种协议,建议安卓/IOS协议相同 window.location.href = ‘actuive://data’; 打开APP首页 window.location.href = ‘actuive://data/gotologin’ 打开APP的登录页面 window.location.href = ...
  • 搭建安卓开发环境

    2014-02-28 16:21:52
    单击“Downloads”选项卡,选择“Java for Developers”,在跳转的页面中滚动到如下位置,单击JDK下方的“Download”按钮。 在新页面中,同意协议并根据电脑硬件和系统而选择适当的版本进行下载。 安装JDK    ...
  • 在应用程序开发过程中,应用中经常会显示一些可点击的文本...”文字中的“用户协议”和“隐私政策”是可点击的点击之后会跳转协议详情界面再如,一个详情界面可能会显示这样的文本:“如有任何疑问请拨打电话:139...
  • 1.怎么实现通知栏到聊天界面的跳转 3 2.聊天界面左右分隔怎么实现,怎么实现优化使其不出现错位 3 3.视频,音频的上传 3 4.http协议和soap协议的区别 3 5.http和https的区别 4 6.listview的逐行显示 5 7....
  • 在应用程序开发过程中,应用中经常会显示一些可点击的文本...”文字中的“用户协议”和“隐私政策”是可点击的点击之后会跳转协议详情界面再如,一个详情界面可能会显示这样的文本:“如有任何疑问请拨打电话:139...
  • 在应用程序开发过程中,应用中经常会显示一些可点击的文本...”文字中的“用户协议”和“隐私政策”是可点击的点击之后会跳转协议详情界面再如,一个详情界面可能会显示这样的文本:“如有任何疑问请拨打电话:139...
  • 本篇文章主要包括两方面,如何从0开始把RN(react-native)项目整合进入现有...整个项目有4个页面用的RN,其他页面走的是native提供的统跳协议跳转到对应的native页面或者是H5页面。 整合RN到android项目中 ...
  • 2015/1/23 星期五 Android应用开发-页面跳转和数据传递 2015/1/24 星期六 Android应用开发-广播和服务 2015/1/25 星期日 2015/1/26 星期一 Android应用开发-广播和服务 2015/1/27 星期二 Android应用开发-多媒体...
  • AI自动化本质上就是所谓通过收集大量数据,然后通过算法,推荐相关数据,也就是数据驱动的自动化;通用协议跳转,这个是开发用于快速调试的,然后被我给发现,可以用于自动化,就是通过安卓...
  • 给大家提供一个官方使用文档(跳转至该文档),希望能对你的理解有所帮助。 下载Java SDK(JDK) 在上述文档中,找到如下图所示的内容: 点击之后,我们接受协议内容,并下载相应版本。(站内下载的时候,可能会需要...
  • //自定义 WebViewClient 辅助WebView设置处理关于页面跳转,页面请求等操作【处理tel协议和视频通讯请求url的拦截转发】 private class MyWebViewClient extends WebViewClient { @Override public boolean ...
  • **ps: 一定一定一定一定先向 ios要 ( ios下载地址 和 ios对应的app协议 ),找安卓要( android下载地址 和 andriod对应的app协议 ) 点击按钮 有两种情况 1.该手机没有app,则跳转下载页面 2.该手机内有app,...

空空如也

空空如也

1 2 3 4
收藏数 67
精华内容 26
关键字:

安卓跳转协议