在最新的应用更新后,我收到了这个新的崩溃异常。似乎没有任何意义。有人能说出问题是什么吗?由于这个原因,它看起来像是一个可能的电子邮件格式化问题:dat = mailto:xxxx@xxxxxxxxx.xxx(有附加内容)....但我不确定我在电子邮件中有任何错误。
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW
dat=mailto:xxxx@xxxxxxxxx.xxx (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:3190)
at android.app.Activity.startActivity(Activity.java:3297)
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:8344)
at android.view.View.dispatchTouchEvent(View.java:5542)
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:1912)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371)
at android.app.Activity.dispatchTouchEvent(Activity.java:2364)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1860)
at android.view.View.dispatchPointerEvent(View.java:5722)
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2897)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2473)
at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2482)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
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:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
谢谢!
这是清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mypackage"
android:versionCode="123"
android:versionName="1.2.3" >
<supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true"/>
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="16"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<permission android:name="com.problemio.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.problemio.permission.C2D_MESSAGE" />
<!-- App receives GCM messages. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/CustomTheme"
android:name="MyApplication"
>
<!-- For Google Cloud Messaging -->
<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.problemio" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" />
<!-- End of Google Cloud Messaging -->
<activity
android:name=".ProblemioActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".AddProblemActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/add_problem" />
<activity
android:name=".LoginActivity"
android:label="@string/login" />
<activity
android:name=".MyProblemsActivity"
android:label="@string/your_problems" />
<activity
android:name=".CreateProfileActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/create_account" />
<activity
android:name=".ProblemActivity"
android:label="@string/problem_page_header" />
<activity
android:name=".WePromoteActivity"
android:label="@string/we_promote" />
<!--
<activity
android:name=".SuggestSolutionActivity"
android:label="@string/suggest_solution_header" />
<activity
android:name=".SuggestedSolutionActivity"
android:label="@string/suggested_solution_header" />
<activity
android:name=".ViewSolutionsActivity"
android:label="@string/view_solutions_header" />
-->
<activity
android:name=".TopicActivity"
android:label="@string/topic_header"
android:configChanges="keyboardHidden|orientation"
android:windowSoftInputMode="stateHidden"/>
<activity
android:name=".ForgotPasswordActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/forgot_password_heading" />
<activity
android:name=".AskQuestionActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/ask_question_heading" />
<activity
android:name=".QuestionActivity"
android:label="@string/question_header"
android:configChanges="keyboardHidden|orientation"
android:windowSoftInputMode="stateHidden"/>
<activity
android:name=".MyQuestionsActivity"
android:label="@string/see_my_questions_header" />
<activity
android:name=".LearnActivity"
android:label="@string/learn_header" />
<activity
android:name=".ExtraHelpActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/extra_help_header" />
<activity
android:name=".content.AdvertisingActivity"
android:label="@string/advertising_header" />
<activity
android:name=".content.ProductStrategyActivity"
android:label="@string/product_strategy_header" />
<activity
android:name=".content.BusinessModelsActivity"
android:label="@string/business_models_header" />
<activity
android:name=".content.StageTacticsActivity"
android:label="@string/stage_tactics_header" />
<activity
android:name=".content.InvestorsActivity"
android:label="@string/funding_header" />
<activity
android:name=".content.TargetMarketActivity"
android:label="@string/target_market_header" />
<activity
android:name=".SettingsActivity"
android:label="@string/settings_header" />
<activity
android:name=".content.BusinessIdeasActivity"
android:label="@string/business_ideas" />
<activity
android:name=".content.MarketIdeaValidationActivity"
android:label="@string/market_idea_validation" />
<activity
android:name=".content.UnitEconomicsActivity"
android:label="@string/unit_economics" />
<activity
android:name=".content.PremiumWebAdvertisingActivity"
android:label="@string/premium_web_marketing" />
<activity
android:name=".content.PsychologyActivity"
android:label="@string/business_psychology" />
<activity
android:name=".NumberOfBusinessesActivity"
android:label="@string/num_of_businesses" />
<activity
android:name=".TimelineActivity"
android:label="@string/timeline" />
<activity
android:name=".content.PitchBusinessActivity"
android:label="@string/pitch" />
<activity
android:name=".content.TopMistakesActivity"
android:label="@string/top_mistakes" />
<activity
android:name=".content.MarktingAndConversionActivity"
android:label="@string/marketing_and_conversion" />
<activity
android:name=".content.HelpInstructionsActivity"
android:label="@string/help_instructions" />
<activity
android:name=".content.WebSetupActivity"
android:label="@string/web_setup_page" />
<activity
android:name=".UpdateProfileActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/update_profile" />
<activity
android:name=".FeedbackActivity"
android:label="@string/feedback"
android:configChanges="keyboardHidden|orientation"
android:windowSoftInputMode="stateHidden"/>
<activity
android:name=".BaseActivity" />
<activity
android:name=".BaseListActivity"/>
<activity
android:name=".EditBusinessActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/edit_business" />
<activity
android:name=".TopicEditActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/topic_edit" />
<activity
android:name=".InviteFriendsActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/invite_friends" />
<activity
android:name=".EnterInviteCodeActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/enter_invite_code" />
<activity
android:name=".CommunityActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/community_page" />
<activity
android:name=".CommunitySignupActivity"
android:label="@string/community_signup" />
<activity
android:name=".PlanExamplesActivity"
android:label="@string/plan_examples" />
<activity
android:name=".Settings"
android:label="@string/plan_examples" />
<activity
android:name=".GiveBackActivity"
android:label="@string/give_back" />
<activity
android:name=".MotivationActivity"
android:label="@string/motivation_page" />
<activity
android:name=".AdsActivity"
android:label="@string/ads_activity" />
<activity
android:name=".content.WebsiteServiceActivity"
android:label="@string/website_service_activity" />
<activity
android:name=".MoreArticlesActivity"
android:label="@string/more_articles" />
<!--
<service android:name="BillingService" />
<receiver android:name="BillingReceiver">
<intent-filter>
<action android:name="com.android.vending.billing.IN_APP_NOTIFY" />
<action android:name="com.android.vending.billing.RESPONSE_CODE" />
<action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" />
</intent-filter>
</receiver>
-->
<activity android:name="com.tapjoy.TJCOffersWebView" android:configChanges="keyboardHidden|orientation" />
<activity android:name="com.tapjoy.TapjoyFullScreenAdWebView" android:configChanges="keyboardHidden|orientation" />
<activity android:name="com.tapjoy.TapjoyDailyRewardAdWebView" android:configChanges="keyboardHidden|orientation" />
<activity android:name="com.tapjoy.TapjoyVideoView" android:configChanges="keyboardHidden|orientation" />
</application>
</manifest>
这样的事情会成为一个问题:
<TextView
android:id="@+id/contact_email"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop ="15dp"
android:autoLink="email"
android:text="some@email.com"
/>
答案 0 :(得分:8)
从我的其他answer
复制我已经遇到了同样的问题,我通过在实际启动null
之前创建一个检查Intent
的新类来解决它。
您需要做的就是在设置URLSpan
的文字之前替换所有TextView
范围(这意味着您无法使用setAutoLinkMask()
)。
必须这样做,因为URLSpan
的{{1}}方法不会执行任何类型的onClick()
检查。
如何成为先例:
null
可以在TextView txt = ...
txt.setLinksClickable(true);
txt.setText(SafeURLSpan.parseSafeHtml(<<YOUR STRING GOES HERE>>));
txt.setMovementMethod(LinkMovementMethod.getInstance());
中使用的各种字符串:
<<YOUR STRING GOES HERE>>
以下是"Click here: <a href=\"http://google.com\">My links</a>"
"Mail me: <a href=\"mailto:john@doe.com\">My email</a>"
... and so on...
课程的来源(我在我的应用FPlay中使用它,并且已在Android 10 +上测试过):
SafeURLSPan
答案 1 :(得分:6)
我也遇到了这个问题,当你定义:
时android:autoLink="email"
android:text="some@email.com"
或TextView中的任何其他类型的自动链接,android会为您处理所有内容。
在模拟器中,默认情况下未设置电子邮件,因此没有应用程序来处理意图,如果您单击自动链接的电子邮件地址,这会使您的应用程序崩溃。如果您打开邮件应用程序并按照说明进行设置,那么当您单击电子邮件地址时它将起作用。
我不知道你可以做些什么来解决这个问题。我想假设用户有邮件设置或至少一个能够处理该意图的应用程序可能不安全。我也猜测应用程序不应该崩溃...我认为这是android的问题,因为在这种情况下你无法处理异常。
如果你看一下URLSpan的来源(如果设置了自动链接,TextView使用android.text.util.Linkify.addLinks(..)创建URLSpan的实例来创建链接): http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/text/style/URLSpan.java#URLSpan
public void onClick(View widget) {
Uri uri = Uri.parse(getURL());
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
}
他们可以处理异常或使用PackageManager来确定Intent是否会在调用startActivity()之前成功(就像他们建议:http://developer.android.com/training/basics/intents/sending.html#Verify)或使用选择器。
虽然Android平台保证某些意图会解析为其中一个内置应用程序(例如电话,电子邮件或日历应用程序),但在调用意图之前应始终包含验证步骤。
警告:如果您调用了一个intent并且设备上没有可以处理意图的应用程序,那么您的应用程序将会崩溃。
所以我的问题是:是否可以保证电子邮件意图始终在真实设备上解析?
好的......在同一部分他们也提到:
注意:您应该在活动首次启动时执行此检查,以防在用户尝试使用该功能之前需要禁用使用该功能的功能。如果您知道可以处理意图的特定应用,您还可以提供用户下载应用的链接(请参阅如何在Google Play上链接到您的产品)。
可以随时检查意图是否解析为应用程序启动时的任何活动,设置标志,每次包含此类TextView的布局都会膨胀,我们会找到它并禁用电子邮件的自动链接等(这是当我思考杀死一个独角兽而非编码时)
答案 2 :(得分:1)
顺便说一下,如果设备上没有设置电子邮件帐户,则不会发生电子邮件客户端,因此从技术上讲,这也可能发生在真实设备上。 以下是novettam建议的无法使用AutoLink的代码:
protected boolean checkIntent(Intent intent)
{
PackageManager packageManager = getPackageManager();
List<ResolveInfo> apps = packageManager.queryIntentActivities(intent, 0);
return apps.size() > 0 && !( apps.get(0).activityInfo.name.equals(activity.getClass().getName()) && apps.size() == 1) ;
}
protected Intent createDummyEmailIntent()
{
final Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto", "abc@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "EXTRA_SUBJECT");
return emailIntent;
}
protected Intent createDummyWebIntent()
{
final Intent webIntent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://www.google.co.uk"));
return webIntent;
}
protected Intent createDummyPhoneIntent(){
String uri = "tel:" + "0131 666 7777".trim() ;
final Intent phoneIntent = new Intent(Intent.ACTION_DIAL);
phoneIntent.setData(Uri.parse(uri));
return phoneIntent;
}
//Checking
if ( !checkIntent(intent) ) {
textview.setAutoLinkMask(0);
}
//be sure that you call setText after this