我有一个正在生产的应用程序,一些用户收到关于 VIEW https Intent 的奇怪 ActivityNotFoundException。我无法在我的物理设备或模拟器上本地重现它。我还假设每个 Android 都有一个默认打开 URL 的浏览器,我错了吗? (遇到该错误的设备都没有被root)。问题可能是因为手机没有 Chrome 吗?
我使用 CustomTabsIntent 打开 URL:
public static void openUrl(final Uri url, final Activity activity) {
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
builder.setToolbarColor(ContextCompat.getColor(activity, R.color.denis_red));
builder.setCloseButtonIcon(
BitmapFactory.decodeResource(activity.getResources(),
R.drawable.ic_arrow_back_white_24dp));
builder.setStartAnimations(activity, R.anim.activity_slide_in_right,
R.anim.activity_slide_out_left);
builder.setExitAnimations(activity, R.anim.activity_slide_in_left,
R.anim.activity_slide_out_right);
builder.build().launchUrl(activity, url);
}
如果有帮助的话,我会添加一些堆栈跟踪。谢谢!
1:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=https://redirect.denis.de/... (has extras) }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2031)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1686)
at android.app.Activity.startActivityForResult(Activity.java:4506)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivity(Activity.java:4825)
at android.support.v4.content.ContextCompat.startActivity(ContextCompat.java:248)
at android.support.customtabs.CustomTabsIntent.launchUrl(CustomTabsIntent.java:263)
at de.boxine.denisapp.util.web.ChromeTabUtil.openUrl(ChromeTabUtil.java:26)
at de.boxine.denisapp.denis.list.DenisListActivity.onOptionsItemSelected(DenisListActivity.java:82)
at android.app.Activity.onMenuItemSelected(Activity.java:3469)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:436)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:196)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:64)
at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:204)
at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:781)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
at android.support.v7.view.menu.MenuPopup.onItemClick(MenuPopup.java:128)
at android.widget.AdapterView.performItemClick(AdapterView.java:318)
at android.widget.AbsListView.performItemClick(AbsListView.java:1158)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3153)
at android.widget.AbsListView$3.run(AbsListView.java:4068)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6626)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
2:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=https://redirect.denis.de/... (has extras) }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1981)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1636)
at android.app.Activity.startActivityForResult(Activity.java:4762)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivity(Activity.java:5119)
at android.support.v4.content.ContextCompat.startActivity(ContextCompat.java:248)
at android.support.customtabs.CustomTabsIntent.launchUrl(CustomTabsIntent.java:263)
at de.boxine.denisapp.util.web.ChromeTabUtil.openUrl(ChromeTabUtil.java:26)
at de.boxine.denisapp.login.LoginActivity.openUrl(LoginActivity.java:205)
at de.boxine.denisapp.login.LoginPresenter.onPasswordForgetLinkClicked(LoginPresenter.java:93)
at de.boxine.denisapp.login.LoginActivity.lambda$onCreate$2$LoginActivity(LoginActivity.java:153)
at de.boxine.denisapp.login.-$$Lambda$LoginActivity$HDjhvwi_2M2aWu9LndZHRP-ar9Q.onClick
at android.view.View.performClick(View.java:6291)
at android.view.View$PerformClick.run(View.java:24931)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7529)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
最佳答案
我找到了自己问题的解决方案,在使用 CustomTabsIntent 之前,您应该检查是否有应用程序可以处理它。如果没有,您可以使用带有 URL 的简单 VIEW Intent 。
以下是检查是否支持 CustomTabsIntent 的方法:
public static boolean isCustomTabSupported(Context context, Uri url) {
return getCustomTabsPackages(context, url).size() > 0;
}
/**
* Returns a list of packages that support Custom Tabs.
*/
public static ArrayList getCustomTabsPackages(Context context, Uri url) {
PackageManager pm = context.getPackageManager();
// Get default VIEW intent handler.
Intent activityIntent = new Intent(Intent.ACTION_VIEW, url);
// Get all apps that can handle VIEW intents.
List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, 0);
ArrayList packagesSupportingCustomTabs = new ArrayList<>();
for (ResolveInfo info : resolvedActivityList) {
Intent serviceIntent = new Intent();
serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION);
serviceIntent.setPackage(info.activityInfo.packageName);
// Check if this package also resolves the Custom Tabs service.
if (pm.resolveService(serviceIntent, 0) != null) {
packagesSupportingCustomTabs.add(info);
}
}
return packagesSupportingCustomTabs;
}
(来源:https://developer.chrome.com/multidevice/android/customtabs#bestpractices)
关于Android - 找不到处理 HTTPS CustomTabsIntent 的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59114551/