单击电子邮件链接时,找不到处理Intent action.VIEW的活动

Gen*_*nik 13 android exception html-email android-intent

在最新的应用更新后,我收到了这个新的崩溃异常.似乎没有任何意义.有人能说出问题是什么吗?由于这个原因,它看起来像是一个可能的电子邮件格式化问题: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)
Run Code Online (Sandbox Code Playgroud)

谢谢!

这是清单文件:

<?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>
Run Code Online (Sandbox Code Playgroud)

这样的事情可能是一个问题:

<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"

    />
Run Code Online (Sandbox Code Playgroud)

car*_*lgn 8

复制了我的其他答案

我已经遇到了同样的问题,我通过创建一个null在实际启动之前检查的新类来解决它Intent.

您需要做的就是URLSpan在设置TextView文本之前替换所有跨度(这意味着您无法使用setAutoLinkMask()).

这有许多工作要做,因为URLSpanonClick()方法不执行任何形式的null检查.

如何成为先例:

TextView txt = ...
txt.setLinksClickable(true);
txt.setText(SafeURLSpan.parseSafeHtml(<<YOUR STRING GOES HERE>>));
txt.setMovementMethod(LinkMovementMethod.getInstance());
Run Code Online (Sandbox Code Playgroud)

可用于以下内容的各种字符串<<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...
Run Code Online (Sandbox Code Playgroud)

这是SafeURLSPan类的源代码(我在我的应用程序FPlay中使用它,它已在Android 10+上测试过):

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Browser;
import android.text.Html;
import android.text.Spannable;
import android.text.style.URLSpan;
import android.view.View;

public final class SafeURLSpan extends URLSpan {
    public SafeURLSpan(String url) {
        super(url);
    }

    @Override
    public void onClick(View widget) {
        try {
            final Uri uri = Uri.parse(getURL());
            final Context context = widget.getContext();
            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            if (context != null && intent != null) {
                intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
                context.startActivity(intent);
            }
        } catch (Throwable ex) {
        }
    }

    public static CharSequence parseSafeHtml(CharSequence html) {
        return replaceURLSpans(Html.fromHtml(html.toString()));
    }

    public static CharSequence replaceURLSpans(CharSequence text) {
        if (text instanceof Spannable) {
            final Spannable s = (Spannable)text;
            final URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
            if (spans != null && spans.length > 0) {
                for (int i = spans.length - 1; i >= 0; i--) {
                    final URLSpan span = spans[i];
                    final int start = s.getSpanStart(span);
                    final int end = s.getSpanEnd(span);
                    final int flags = s.getSpanFlags(span);
                    s.removeSpan(span);
                    s.setSpan(new SafeURLSpan(span.getURL()), start, end, flags);
                }
            }
        }
        return text;
    }
}
Run Code Online (Sandbox Code Playgroud)


nov*_*tam 6

我也遇到了这个问题,当你定义时:

android:autoLink="email"
android:text="some@email.com"
Run Code Online (Sandbox Code Playgroud)

或者在TextView中的任何其他类型的自动链接,android为您处理一切.

在模拟器中,默认情况下不会设置电子邮件,因此没有应用程序来处理意图,如果您单击自动链接的电子邮件地址,这会使您的应用程序崩溃.如果您打开邮件应用程序并按照说明进行设置,那么当您单击电子邮件地址时,它将起作用.

我不知道你可以做些什么来解决这个问题.我想假设用户有邮件设置或至少一个能够处理该意图的应用程序可能不安全.我也猜测应用程序不应该崩溃...我认为这是android的问题,因为在这种情况下你无法处理异常.

如果你看一下URLSpan的来源(如果设置了自动链接,Tex​​tView使用android.text.util.Linkify.addLinks(..)创建URLSpan的实例来创建链接):http://grepcode.com/file/repository .grepcode.com/JAVA /转/ com.google.android /安卓/ 4.1.2_r1 /安卓/文本/风格/ 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);
}
Run Code Online (Sandbox Code Playgroud)

他们可以处理异常或使用PackageManager来确定Intent在调用startActivity()之前是否会成功(就像他们推荐的那样:http://developer.android.com/training/basics/intents/sending.html#Verify)或者使用它们一个选择器.

虽然Android平台保证某些意图将解析为内置应用程序之一(例如电话,电子邮件或日历应用程序),但您应始终在调用意图之前包含验证步骤.

警告:如果您调用intent并且设备上没有可以处理意图的应用程序,则您的应用程序将崩溃.

所以我的问题是:是否可以保证电子邮件意图始终在真实设备上解析?

好的...在同一部分他们也提到:

注意:您应该在活动首次启动时执行此检查,以防在用户尝试使用该功能之前需要禁用使用该功能的功能.如果您知道可以处理意图的特定应用,您还可以提供用户下载应用的链接(请参阅如何在Google Play上链接到您的产品).

人们可以随时检查意图是否解析为应用程序启动时的任何活动,设置标志,每次包含此类TextView的布局都会膨胀,我们会找到它并禁用电子邮件的自动链接等等(这是我在思考的时候)通过编码杀死独角兽)