13

最新のアプリの更新後に、この新しいクラッシュ例外が発生しました。どこも指していないようです。誰が問題が何であるかを伝えることができますか? 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"

    />
4

3 に答える 3

8

私の他の答えからコピー

私はすでに同じ問題を抱えていましたnull..Intent

のテキストを設定する前に、すべてのURLSpanスパンを置き換えるTextViewだけです (これは、 を使用できないことを意味しますsetAutoLinkMask())。

URLSpanのメソッドはいかなる種類のチェック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...

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;
    }
}
于 2014-09-25T15:20:37.710 に答える
6

私もこの問題に遭遇しました。問題は、次のように定義することです。

android:autoLink="email"
android:text="some@email.com"

または TextView 内の他のタイプの自動リンクの場合、Android がすべてを処理します。

エミュレーターでは、メールはデフォルトで設定されていないため、インテントを処理するアプリがなく、自動リンクされたメール アドレスをクリックするとアプリがクラッシュします。メールアプリを開いて指示に従って設定すると、メールアドレスをクリックすると機能します。

この問題を回避するために何ができるかわかりません。ユーザーがメールをセットアップしているか、その意図を処理できるアプリを少なくとも 1 つ持っていると想定するのは安全ではないかもしれません。また、アプリがクラッシュするべきではないと思います...この場合、例外を処理する方法がないため、これはAndroidの問題だと思います。

URLSpan のソースを見ると (自動リンクが設定されている場合、TextView は URLSpan のインスタンスを作成してリンクを作成する android.text.util.Linkify.addLinks(..) を使用します): 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 を使用して、startActivity() を呼び出す前にインテントが成功するかどうかを判断することができます (推奨されるように: http://developer.android.com/training/basics/intents/sending.html#Verify ) 。選択者。

Android プラットフォームでは、特定のインテントがいずれかの組み込みアプリ (電話、メール、カレンダー アプリなど) に解決されることが保証されていますが、インテントを呼び出す前に必ず検証手順を含める必要があります。

注意: インテントを呼び出したときに、そのインテントを処理できるアプリがデバイスにない場合、アプリはクラッシュします。

私の質問は次のとおりです: 電子メールの意図が常に実際のデバイスで解決されるという保証はありますか?

わかりました...同じセクションで、彼らも言及しています:

注: ユーザーがインテントを使用しようとする前に、インテントを使用する機能を無効にする必要がある場合に備えて、アクティビティの最初の開始時にこのチェックを実行する必要があります。インテントを処理できる特定のアプリがわかっている場合は、ユーザーがアプリをダウンロードするためのリンクを提供することもできます (Google Play で製品にリンクする方法を参照してください)。

アプリケーションの開始時に意図が何らかのアクティビティに解決されるかどうかを常に確認し、フラグを設定し、そのような TextView を含むレイアウトが膨張するたびに、それを見つけて電子メールの自動リンクを無効にすることができます。コーディングでユニコーンを殺す)

于 2013-02-24T02:02:56.520 に答える
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 
于 2014-07-27T23:13:44.380 に答える