Mervin Hemaraju
Mervin Hemaraju

Reputation: 2117

Android: Settings Preference Intent is Not Working

I have a setting preference from which upon clicking on a certain preference, i want to open the default mail app. My code is as follows:

preference.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

...

        <PreferenceCategory
        app:key="@string/settings_key_category_help"
        app:title="@string/settings_title_category_help">

        <Preference
            app:key="@string/settings_key_help_feedback"
            app:summary="@string/settings_summary_help_feedback"
            app:title="@string/settings_title_help_feedback"
            app:icon="@drawable/ic_feedback">

            <intent
                android:action="android.intent.action.SENDTO" />
        </Preference>

    </PreferenceCategory>

</PreferenceScreen>

FragmentSettings.kt

class SettingsFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.xml_settings_main, rootKey)
    }

    override fun onStart() {
        super.onStart()

        feedbackPreference()
    }

    private fun feedbackPreference(){
        findPreference<Preference>(getString(R.string.settings_key_help_feedback))?.setOnPreferenceClickListener {

            Log.i("Settings_Test", "Hit")

            val intent = Intent(Intent.ACTION_SENDTO).apply {
                type = "text/plain"
                putExtra(Intent.EXTRA_EMAIL, arrayOf("[email protected]")) // recipients
                putExtra(Intent.EXTRA_SUBJECT, "Email subject")
                putExtra(Intent.EXTRA_TEXT, "Email message text")
            }

            it.intent = intent

            true
        }
    }

}

However, when i click on the feedback settings, nothing happens. I can see the log "Hit" in the logcat. Am i using the intent in the wrong way here? can someone please help me.

Upvotes: 1

Views: 737

Answers (1)

atyc
atyc

Reputation: 1086

There are two ways to achieve your goal, choose one depends on your case:

  1. Using intent and extra tag in your preference.xml
<Preference
    app:key="@string/settings_key_help_feedback"
    app:summary="@string/settings_summary_help_feedback"
    app:title="@string/settings_title_help_feedback"
    app:icon="@drawable/ic_feedback">

    <intent android:action="android.intent.action.VIEW"
        android:data="mailto:[email protected]" >
        <extra
            android:name="android.intent.extra.SUBJECT"
            android:value="Email subject"/>
        <extra
            android:name="android.intent.extra.TEXT"
            android:value="Email message text"/>
    </intent>
</Preference>

in res/values/strings.xml, set your email address

<string name="contact_help_feedback_uri">mailto:[email protected]</string>
  1. Using Intent in your FragmentSettings.kt
<Preference
    app:key="@string/settings_key_help_feedback"
    app:summary="@string/settings_summary_help_feedback"
    app:title="@string/settings_title_help_feedback"
    app:icon="@drawable/ic_feedback" />
class SettingsFragment : PreferenceFragmentCompat() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        findPreference<Preference>(getString(R.string.settings_key_help_feedback))?.setOnPreferenceClickListener {
            val intent = Intent(Intent.ACTION_SEND).apply {
                type = "plain/text"
                putExtra(Intent.EXTRA_EMAIL, arrayOf("[email protected]"))
                putExtra(Intent.EXTRA_SUBJECT, "subject")
                putExtra(Intent.EXTRA_TEXT, "mail body")
            }
            startActivity(Intent.createChooser(intent, ""))
            true
        }
    }
}

Upvotes: 3

Related Questions