为什么位智深度链接在异步任务中不起作用?

Why does waze deeplink not work in asynctask?

背景

我正在尝试在任务对地址进行地理编码后,使用异步任务 onPostExecute 的以下意图启动 waze,但它不起作用。 link 工作正常,正如我解释的那样,它与从 onPostExecute 启动意图有关 说无法解决 logcat.

中的意图

class声明:

public static class WazeAsyncLaunch extends AsyncTask<String, Void, Intent> {
    Context mContext = null;
    public WazeAsyncLaunch(Context context){
        mContext = context;
    }

这是 doInBackground

protected Intent doInBackground(String... addresses) {

    //does geocoding here, i give short version
    Uri intentURI = Uri.parse("https://waze.com/ul?ll=48.8566969,2.3514616&navigate=yes");
    Intent mapIntent = new Intent(Intent.ACTION_VIEW);
    mapIntent.setData(intentURI);
    mapIntent.addCategory(Intent.CATEGORY_DEFAULT);
    mapIntent.addCategory(Intent.CATEGORY_BROWSABLE);
    return mapIntent;
}

这里是 onPostExecute,错误发生的地方

protected void onPostExecute(Intent result) {
    mContext.startActivity(result);
}

我像这样从主活动中的按钮 onclick 事件处理程序调用它

new WazeAsyncLaunch(MainActivity.this).execute(address);

根据社区指针,我也在我的 onPostExecute 中尝试了这个,但无济于事

String url = "https://www.waze.com/ul?ll=40.75889500%2C-73.98513100&navigate=yes&zoom=17";
Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( url ) );
startActivity( intent );

有趣的是,当我这样做时也不起作用:

adb shell am start -a android.intent.action.VIEW -c android.intent.category.DEFAULT -c android.intent.category.BROWSABLE -d https://waze.com/ul?ll=48.8566969,2.3514616&navigate=yes

但是当我这样做时它确实有效:

adb shell am start -d https://waze.com/ul?ll=48.8566969,2.3514616&navigate=yes

当我在 phone 上单击此 link 时它也有效 https://waze.com/ul?ll=48.8566969,2.3514616&navigate=yes

指点:

设备上没有安装浏览器。 (仅位智)。

--在 waze 的清单中有以下意图过滤器:

<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="http"/>
   <data android:scheme="https"/>
   <data android:host="www.waze.com"/>
   <data android:host="waze.com"/>
   <data android:pathPattern="/ul.*"/>
</intent-filter>

所以不知道为什么我的代码不起作用,但是考虑到 adb 和 link click 的事实,我发现当仅传递数据而没有类别和操作时,意图有效。 但我不知道如何在 java 中启动仅包含数据而没有其他属性的意图。

问题

如何仅使用数据字符串从 java 启动 Intent? 或者是否有其他解决方案?

像下面的代码一样改变你的意图

try
{

  String url = "https://www.waze.com/ul?ll=40.75889500%2C-73.98513100&navigate=yes&zoom=17";
  Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( url ) );
  startActivity( intent );
}
catch ( ActivityNotFoundException ex  )
{
  // If Waze is not installed, open it in Google Play:
  Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( "market://details?id=com.waze" ) );
  startActivity(intent);
}

这里是完整的工作代码。 1 首先制作一个 class 如下所示

import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;

public class WazeClass{

    public static Context mContext;
    public static String address;
    public WazeClass(Context context,String waddress) {
        super();
        mContext = context;
        address = waddress;
    }



    public static class WazeShow extends AsyncTask<String,Void,Intent>
    {

        public WazeShow(Context applicationContext) {
            mContext = applicationContext;
        }

        @Override
        protected Intent doInBackground(String... strings) {
            String url = "https://www.waze.com/ul?ll=40.75889500%2C-73.98513100&navigate=yes&zoom=17";
            Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( url ) );
            return intent;
        }

        @Override
        protected void onPostExecute(Intent intent) {
            super.onPostExecute(intent);
            try
            {
                mContext.startActivity(intent);
            }
            catch ( ActivityNotFoundException ex  )
            {
                // If Waze is not installed, open it in Google Play:
                Intent playintent = new Intent( Intent.ACTION_VIEW, Uri.parse( "market://details?id=com.waze" ) );
                mContext.startActivity(intent);
            }

        }
    }
}

然后从任何片段调用或 activity.if 从片段调用使用 getContext();

new WazeClass.WazeShow(getApplicationContext()).execute("address");