为什么位智深度链接在异步任务中不起作用?
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");
背景
我正在尝试在任务对地址进行地理编码后,使用异步任务 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");