Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从Chrome到本机应用程序的深度链接_Android_Ios_Google Chrome_Deep Linking_Uber Api - Fatal编程技术网

Android 从Chrome到本机应用程序的深度链接

Android 从Chrome到本机应用程序的深度链接,android,ios,google-chrome,deep-linking,uber-api,Android,Ios,Google Chrome,Deep Linking,Uber Api,我正在使用Uber API,它使用Uber://?…URL深入链接到Uber原生应用程序。我正在建设一个移动网站,我正在建设这些网址之一 在iOS上,一切正常,但在Android上,Uber应用程序打开,只获取一个参数product\u id。因此,我认为我如何编码URL以及Android系统如何打开URL存在一些问题。以下是我构建URL的JS: uber.createURL = function() { var params = { "client_id": uber

我正在使用Uber API,它使用
Uber://?…
URL深入链接到Uber原生应用程序。我正在建设一个移动网站,我正在建设这些网址之一

在iOS上,一切正常,但在Android上,Uber应用程序打开,只获取一个参数
product\u id
。因此,我认为我如何编码URL以及Android系统如何打开URL存在一些问题。以下是我构建URL的JS:

uber.createURL = function() {

    var params = {
        "client_id": uber.CLIENT_ID,
        "product_id": maps.product_id,
        "pickup[latitude]": maps.noSurgeMarker.getPosition().lat(),
        "pickup[longitude]": maps.noSurgeMarker.getPosition().lng(),
        "dropoff[latitude]": maps.destMarker.getPosition().lat(),
        "dropoff[longitude]": maps.destMarker.getPosition().lng(),
        "pickup[formatted_address]": $('#pickup').val(),
        "dropoff[formatted_address]": $('#destination').val()
    };

    var url = 'uber://?action=setPickup';

    for (var key in params) {
        if (params.hasOwnProperty(key)) {
            url += ('&' + key + '=' + encodeURIComponent(params[key]));
        }
    }

    return url;
};
然后我调用以下代码打开链接:

var url = uber.createURL();
window.location.href = url;
我错过了什么明显的东西吗?同样,这适用于iOS,但不适用于Android。同样奇怪的是,如果我在电脑上使用
createURL
生成URL,然后使用PushBullet将其发送到我的Android设备,打开它就可以完美地工作。但是如果我通过Chrome for Android获取URL,Uber应用程序就会打开,并且只有
产品id
正确,没有任何收货或放货部分


注意:我已经使用jQuery的
params
函数实现了trued,但这并没有起到更好的作用,这就是为什么我去手动
for(var-key-in-params){…}
循环的原因。

您需要在key和params[key]上调用
encodeUriComponent
.

好吧,我发现这不是编码问题,而是Chrome如何发布应用程序的问题。这是Pushbullet的一个意图,这个很好:

I/ActivityManager(  942): START u0 
{act=android.intent.action.VIEW 
dat=uber://?
client_id=REDACTED&
action=setPickup&
product_id=a1111c8c-c720-46c3-8534-2fcdd730040d&
pickup[latitude]=37.780654&
pickup[longitude]=-122.405599&
dropoff[latitude]=37.7970558&
dropoff[longitude]=-122.43199099999998
flg=0x10000000 cmp=com.ubercab/.client.feature.launch.LauncherActivity} from pid 19023
这是Chrome的一个意图,它启动了Uber应用程序,但应用程序没有解析任何数据(它只是打开,就像我单击了启动器图标一样):

您可以看到唯一的区别是添加了
cat=[android.intent.category.BROWSABLE]
,这是从Chrome for android()启动intent所必需的


所以总体而言,我认为这是优步必须解决的问题。现在看来,如果我想让我的网站正常运行,我必须把它打包成Android应用程序中的
WebView

这实际上让事情变得更糟了。现在,当我手动将它复制到手机上时,它甚至不起作用。嗯,可能是它意外地编码了=或&或?尝试
url+=('&'+encodeURIComponent(key)+'='+encodeURIComponent(params[key])。我认为方括号很麻烦。下面是@GregEnnis的答案。它不起作用…现在,当你等待uber修复他们的东西(解码他们的uri)的时候。。。还有一件事你可以试试。在源代码中有另一种表示法(用于文档末尾的web服务)使用下划线而不是方括号,即
picku\u latitude
而不是
picku[latitude]
。如果这不起作用,我就没有主意了。@hatboysam如果你能准确地看到优步的意图是什么样子的,这会有帮助吗?@Alexandrusianu这是个好主意,不幸的是它不会拦截这个主意。不过,我会在未来的开发中大量使用该应用程序,这很有帮助。他们已将
添加到与
uber://
方案匹配的意图过滤器中
I/ActivityManager(  942): START u0 
{act=android.intent.action.VIEW 
cat=[android.intent.category.BROWSABLE] 
dat=uber://?
client_id=REDACTED&
action=setPickup&
product_id=a1111c8c-c720-46c3-8534-2fcdd730040d&
pickup[latitude]=37.780654&
pickup[longitude]=-122.405599&
dropoff[latitude]=37.7970558&
dropoff[longitude]=-122.43199099999998
flg=0x10000000 cmp=com.ubercab/.client.feature.launch.LauncherActivity (has extras)} from pid 26446