Pertanyaan Tidak dapat memperoleh AuthToken untuk akun khusus dari aplikasi yang berbeda


Saya memiliki dua aplikasi yang berfungsi dengan jenis akun yang sama. Saya ingin halaman di bawah ditampilkan ketika pengguna membuka aplikasi kedua untuk pertama kalinya dan satu akun ada:

enter image description here

Tetapi tidak ada yang terjadi ketika saya menjalankan kode ini:

final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, null, null);

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Bundle bnd = future.getResult();

            final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
            showMessage((authtoken != null) ? "SUCCESS!\ntoken: " + authtoken : "FAIL");
            Log.d("udinic", "GetToken Bundle is " + bnd);
        } catch (Exception e) {
            e.printStackTrace();
            showMessage(e.getMessage());
        }
    }
}).start();

Kode di atas berfungsi dengan benar ketika saya menjalankannya dari aplikasi yang memiliki authenticator. Ketika saya menjalankan kode di bawah sebagai gantinya, sistem menghasilkan pemberitahuan bahwa ketika saya mengkliknya, gambar di atas muncul.

final AccountManagerFuture<Bundle> future = mAccountManager
        .getAuthToken(account, authTokenType, null, true,
                null, handler);

Mengklik tombol izinkan mengembalikan AuthToken benar. Namun saya ingin melihat halaman izin pemberian (gambar di atas) saat menelepon getAuthToken, bukan dengan mengklik notifikasi. Bagaimana saya bisa melakukannya?


7
2017-09-05 13:40


asal


Jawaban:


Saya menggunakan metode ini daripada yang sebelumnya dan sekarang saya melihat dialog konfirmasi:

accountManager.getAuthToken(account, AUTH_TOKEN_TYPE_FULL_ACCESS, null, true, new AccountManagerCallback<Bundle>() {
            @Override
            public void run(AccountManagerFuture<Bundle> future) {
                try {
                    Bundle bundle = future.getResult();
                    String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

                } catch (OperationCanceledException | IOException | AuthenticatorException e) {

                }
            }
}, null);

Perhatikan bahwa aplikasi kedua harus memiliki tanda tangan yang berbeda. Jika kedua aplikasi memiliki tanda tangan yang sama, tidak diperlukan konfirmasi dan authToken akan mengambil.


1
2018-06-01 12:08



Ada beberapa hal yang harus dibahas di sini. Menggunakan Thread di Android umumnya dianggap praktik buruk, per dokumen Android, disarankan untuk menggunakan tugas atau Operator Async. Sekarang untuk pesan Auth per dokumentasi Android, keluaran yang diharapkan adalah pemberitahuan.

getAuthToken(Account account, String authTokenType, Bundle options, boolean notifyAuthFailure, AccountManagerCallback<Bundle> callback, Handler handler)

Mendapat token autentikasi dari jenis yang ditentukan untuk akun tertentu,   secara opsional meningkatkan pemberitahuan jika pengguna harus memasukkan kredensial.

Perhatikan bagaimana getAuthToken memiliki parameter Handler? Ini akan menjadi metode yang disukai untuk menangani async tugas. Masalahnya di sini adalah you CAN NOT have a full screen message on a handler thread, because it can't interrupt the UI thread. Dalam contoh pertama Anda, Anda benar-benar memanggil panggilan mAccountManager pada utas UI, sehingga memungkinkan untuk mengambil alih UI dan mengirim layar penuh memungkinkan atau menolak pesan, namun ini tidak dapat dilakukan dengan handler, karena handler tidak dapat menggunakan untaian UI (akan melemparkan kesalahan saat runtime).

Solusi yang saya usulkan? Jangan gunakan handler jika Anda menginginkan pesan interupsi penuh layar, lakukan tindakan pada utas UI, mirip dengan cuplikan kode pertama Anda.

AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, callback, null); 
//USE implements and implement a listener in the class declaration and 
//use 'this' in the callback param OR create a new callback method for it

0
2017-09-15 02:25