Transfer cepat dari pesan instan - QIWI Android Wallet

Halo!

Nama saya Alex, saya seorang pengembang di QIWI.

TL; DR

Cara mentransfer dari messenger langsung ke formulir pembayaran:

  1. Dalam manifes kita meletakkan Aktivitas c kosong dari intent-filter jenis ACTION_VIEWdan ACTION_DIALdengan skema "tel".
  2. Dalam aktivitas, kami mentransfer ke formulir pembayaran melalui deeplink yang ada, memperkayanya dengan data dari aslinya intent- β€œtel:XXXXX”



Keuntungan : dengan mengklik nomor telepon yang disorot di messenger, seseorang mendapatkan formulir transfer dengan bidang yang telah diisi dari penerima transfer.
Bonus : Saya akan memberi tahu Anda betapa indahnya mengaktifkan fitur ini, tanpa bisa mengubah daftar filter-maksud dalam manifes dalam runtime.

Untuk apa?


Misalkan seseorang memiliki tugas mentransfer uang untuk hadiah ulang tahun kolektif. Pihak penerima dapat memilih opsi transfer yang mudah: transfer ke kartu, dompet elektronik, transfer langsung ke akun atau yang lainnya. Banyak perusahaan yang menyediakan layanan terjemahan menerima nomor telepon sebagai pengidentifikasi pengguna sekunder atau primer. Untuk menghindari transfer yang salah, penerima dapat menyampaikan nomor teleponnya melalui pesan teks: email, instant messenger atau SMS. Pesan itu juga menunjukkan sistem yang diperlukan untuk terjemahan.

Lintasan pengguna yang umum adalah menyalin nomor telepon dari messenger dan menempelkannya ke dalam aplikasi untuk diterjemahkan. Cara ini melibatkan perpindahan antar aplikasi, mungkin mengakses desktop dan bahkan mencari di antara aplikasi yang terinstal dari penyedia layanan terjemahan. Apakah mungkin untuk memperpendek jalur ini dengan mengurangi jumlah langkah? Ada opsi.

Teori


Banyak pengirim pesan instan di telepon pintar mengenali nomor telepon dan menyorotnya dalam bentuk hyperlink. Secara default, ada aplikasi untuk memproses tautan semacam ini di perangkat seluler apa pun dengan modul GSM. Biasanya disebut "Telepon". Di Android, kemampuan untuk memproses nomor telepon bersama dinyatakan dalam AndroidManifest. Contoh aplikasi: "Telepon", Viber, Skype. Jika Anda mencegat peristiwa ini, Anda dapat segera memberikan daftar tindakan yang mungkin kepada pengguna dengan nomor telepon. Dalam kasus kami, ini akan menjadi tawaran transfer melalui QIWI Wallet.

Kami tertarik pada acara dengan tipe Intent.ACTION_VIEW, Intent.ACTION_DIAL, Intent.ACTION_CALLdengan skema tel. PeristiwaIntent.ACTION_CALLIni memiliki batasan pada kebijakan keamanan Android dan inisialisasi memerlukan izin dari pengguna mulai dari versi Marshmallow inklusif. Menurut utusan penelitian kami menggunakan lebih umum Intent.ACTION_VIEW, Intent.ACTION_DIAL.

Ada beberapa jenis yang serupa khusus untuk telepon darurat, tetapi ini jelas bukan kasus kami. Badan maksud memiliki bentuk "tel: 12345678". Niat semacam ini tidak dapat diproses android.content.UriMatcher, karena host tidak ada di sini. Cara termudah untuk menangani jenis Uri ini adalah dengan bertanya schemeSpecificPart dan memeriksa apakah itu nomor telepon yang valid.

Daftar filter maksud harus ditentukan dalam AndroidManifest, tidak mungkin untuk mengubahnya selama eksekusi aplikasi. Bagaimana cara menonaktifkan fitur ini dari jarak jauh? Opsi pertama adalah menolak permintaan pengguna pada saat Kegiatan dibuka - dengan pesan atau cukup tutup aplikasi. Dari sudut pandang kami, ini bukan UX terbaik, karena kami akan mengganggu aliran pengguna di tengah. Lebih baik jika kita tidak membiarkan seseorang memilih aplikasi kita sama sekali, jika fungsinya dinonaktifkan. Lebih mudah untuk menonaktifkan komponen dengan daftar intent-filter dalam runtime, ini tidak akan memberikan pengguna janji-janji palsu di antarmuka sistem. Saat menggunakan PackageManager, perhatikan bahwa memeriksa inklusi komponen tidak terlalu andal. Lebih baik untuk enabled memaksa panji komponen tanpa mengandalkan kondisi saat ini menggunakan nilaiCOMPONENT_ENABLED_STATE_ENABLED dan COMPONENT_ENABLED_STATE_DISABLED. Perubahan yang dilakukan melalui PackageManager disimpan hingga aplikasi dihapus dari perangkat.

Praktek


Untuk menonaktifkan fitur ini, kita memerlukan komponen Android untuk menonaktifkannya.
Cara termudah adalah dengan menggunakan Kegiatan kosong, yang akan kita lakukan. Jika Anda memutuskan untuk menggunakan Layanan dengan filter maksud yang serupa, lihat panduan Google, yang secara spesifik mengatakan "jangan menyatakan filter niat untuk layanan Anda" . Harap dicatat bahwa secara default komponen dinonaktifkan:android:enabled="false"

  <activity
            android:name=".messengerP2P.view.MessengerP2PActivity"
            android:configChanges="orientation"
            android:label="@string/title_activity_messenger_p2_p"
            android:enabled="false"
            android:screenOrientation="portrait">
            <!-- Open shared telephone number as dial application -->
            <intent-filter

                android:label="@string/title_activity_messenger_p2_p">
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.DIAL" />

                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="tel" />
            </intent-filter>
        </activity>

Kegiatan itu sendiri hanya mengarahkan ke bentuk pembayaran melalui diplink yang ada.

class MessengerP2PActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        var phoneNumberFromDial: String? = intent?.data?.schemeSpecificPart
        phoneNumberFromDial?.let {
            if (ru.mw.utils.Utils
                    .isPhoneNumber(phoneNumberFromDial)) {
                val phoneNumberFromDialLink = PaymentActivity.getUriForProviderId(
                        resources.getInteger(R.integer.providerIdQiwiWallet).toLong(), null, null)
                    .buildUpon()
                    .appendQueryParameter(PaymentActivity.QUERY_PARAM_ACCOUNT, phoneNumberFromDial)
                startActivity(
                    Intent(Intent.ACTION_VIEW, phoneNumberFromDialLink.build()))
            }
        }
        finish()
    }
}

Bendera android: enabled dapat dikontrol oleh kelas pembantu ini.

import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager

class MessengerP2PUtils {

    companion object {
        private const val componentName = "ru.mw.messengerP2P.view.MessengerP2PActivity"

        private fun switchMessengerP2P(enabled: Boolean = true, packageName: String, packageManager: PackageManager) {
            val compName = ComponentName(packageName, componentName)
            packageManager.setComponentEnabledSetting(
                compName,
                when (enabled) {
                    true -> PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                    else -> PackageManager.COMPONENT_ENABLED_STATE_DISABLED
                },
                PackageManager.DONT_KILL_APP)
        }

        fun enableMessengerP2P(applicationContext: Context) {
            val packageName = applicationContext.packageName
            val packageManager = applicationContext.packageManager
            switchMessengerP2P(enabled = true, packageName = packageName, packageManager = packageManager);
        }

        fun disableMessengerP2P(applicationContext: Context) {
            val packageName = applicationContext.packageName
            val packageManager = applicationContext.packageManager
            switchMessengerP2P(enabled = false, packageName = packageName, packageManager = packageManager);
        }

        fun isMessengerP2PEnabled(packageName: String, packageManager: PackageManager): Boolean {
            val state = packageManager.getComponentEnabledSetting(ComponentName(packageName, componentName))
            return state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
        }

    }
}

Di sini, metode "isMessengerP2PEnabled" tidak digunakan untuk memeriksa keadaan komponen saat ini, karena selama pengujian itu menghasilkan hasil yang tidak dapat diandalkan. Jika Anda memutuskan untuk menggunakannya, periksa dengan cermat operasinya dalam kondisi logika bisnis asinkron dan saat mengunduh aplikasi.

Waktu untuk mengubah nilai bendera enabled tidak terlalu penting, kami memilih saat ketika konfigurasi fitur-flag sudah dimuat penuh.

Sehingga ketika Anda mengklik nomor telepon di messenger ada dialog sistem pilihan, Anda perlu memberikan pengguna dengan instruksi tentang cara membuang pengaturan default untuk maksud-a "tel: XXXXX". Sebagai contoh: "Jika Anda hanya dapat melakukan panggilan ketika Anda mengklik nomor, pergi ke Pengaturan Smartphone β†’ pilih Telepon di daftar aplikasi β†’ reset pengaturan ke" Buka secara default. "


Jika Anda menonaktifkan komponen saat bepergian, saat pengguna diperlihatkan dialog sistem ini, tidak ada hal buruk yang akan terjadi. Item yang sesuai akan langsung hilang dari daftar, dalam kasus kami "Transfer uang".

Perilaku yang menarik akan dimulai jika pengguna memproses tautan melalui aplikasi kami secara default. Untuk melakukan ini, cukup dengan menyodok item "Ingat pilihan" atau "Selalu". Jika Anda menonaktifkan komponen, maka pengguna akan diberikan pilihan aplikasi mana yang akan digunakan, dan pada awal pertama tidak akan ada item "Ingat pilihan". Setelah mengaktifkan fitur, seluruh aliran akan dipulihkan, pengguna akan ditransfer ke aplikasi secara langsung.

Kesimpulan


Gagasan fitur ini datang kepada kami sejak lama, tiket asli dibuat pada 2017. Idenya belum kehilangan relevansinya bahkan sekarang, saya tidak dapat menemukan aplikasi perbankan dengan fungsi yang sama. Kami merilis "transfer dari messenger" pada 29 April, pada hari pertama hampir 8.000 pengguna unik memanfaatkannya. Jika indikator bisnis dalam waktu dekat akan memuaskan kami, kami akan mengembangkan fitur ini lebih lanjut.

Bagaimana menurut Anda, berapa banyak niat lebih menarik dari Android yang menunggu aplikasi bisnis mereka secara damai?

All Articles