Sta*_*tan 4 android android-activity activitynotfoundexception
所以我的应用程序有一个例外如下:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://google.com (has extras) }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1512)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1384)
at android.app.Activity.startActivityForResult(Activity.java:3248)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:839)
at android.app.Activity.startActivity(Activity.java:3359)
at android.text.style.URLSpan.onClick(URLSpan.java:62)
at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:212)
at android.widget.TextView.onTouchEvent(TextView.java:8704)
at android.view.View.dispatchTouchEvent(View.java:5556)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1940)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1390)
at android.app.Activity.dispatchTouchEvent(Activity.java:2414)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1888)
at android.view.View.dispatchPointerEvent(View.java:5736)
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3017)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2582)
at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:887)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2591)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4697)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
这不会导致我的代码.我认为当用户点击文本中的URL时会发生这种情况(并且应用中有URL的文本).它是什么?怎么可能是Android设备没有浏览器?如何绕过这个或者至少要抓住(我需要在文本中点击URL)?
更新
实际上我发现这个异常发生在TextView中,它是一个空的列表视图存根:
listView = (ListView) findViewById(R.id.listView);
// empty pass list with clickable url inside
final TextView listEmptyView = (TextView) findViewById(R.id.txtNoPasses);
listEmptyView.setMovementMethod(LinkMovementMethod.getInstance());
listView.setEmptyView(listEmptyView);
Run Code Online (Sandbox Code Playgroud)
所以我尝试了这个(遵循CommonsWare的文章),但在这种情况下我的URL仍然完全无法点击:
listView = (ListView) findViewById(R.id.listView);
// empty pass list with clickable url inside
final TextView listEmptyView = (TextView) findViewById(R.id.txtNoPasses);
fixTextView(listEmptyView);
listView.setEmptyView(listEmptyView);
}
private void fixTextView(TextView textView) {
final SpannableString current = new SpannableString(textView.getText());
final URLSpan[] spans = current.getSpans(0, current.length(), URLSpan.class);
int start, end;
for (URLSpan span : spans) {
start = current.getSpanStart(span);
end = current.getSpanEnd(span);
current.removeSpan(span);
current.setSpan(new DefensiveURLSpan(span.getURL()), start, end, 0);
}
}
private static class DefensiveURLSpan extends URLSpan {
public DefensiveURLSpan(String url) {
super(url);
}
@Override
public void onClick(View widget) {
try {
android.util.Log.d(getClass().getSimpleName(), "Got here!");
super.onClick(widget);
}
catch (ActivityNotFoundException e) {
// do something useful here
// android.text.SpannedString cannot be cast to android.text.SpannableString
}
}
}
Run Code Online (Sandbox Code Playgroud)
和TextView:
<TextView
android:id="@+id/txtNoPasses"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="gone"
android:gravity="center"
android:padding="15dp"
android:text="@string/no_passes"
android:textAppearance="?android:attr/textAppearanceMedium"/>
Run Code Online (Sandbox Code Playgroud)
和no_passes字符串如下:
<string name="no_passes">Currently you have no cards to use.\n<a href="http://cardz.website.com">You could add some cards from our website</a></string>
Run Code Online (Sandbox Code Playgroud)
我假设这是一个带有android:autolinkset 的TextView ,或者以其他方式显示HTML(例如,使用Html.fromHtml()).
问题是这会URLSpan为嵌入式URI 创建实例,并且此类startActivity()使用提供的URI "盲目地"调用.只要URI与任何已注册的活动不匹配,就会崩溃.对于"http"URL,这可能在设备没有浏览器应用程序时发生,或者(更有可能)在使用阻止访问它的受限制配置文件时发生.
这个问题及其解决方案在此CommonsWare帖子中得到了很好的解释.您可以使用URLSpan截取的自定义派生类替换实例onClick()以避免异常.
有关相关问题,请参阅此答案.
| 归档时间: |
|
| 查看次数: |
2116 次 |
| 最近记录: |