2014-09-14 23 views
9

Android'de AccountManager özel bir hesap türü uygulayan Ben akışında işareti aşağıdaki sorun var: OAth sağlayıcı üzerinden gerçekleşmesi gerektiğini deTarayıcı niyet ve doğru aktivite (kapat açılan sekme) dönmek

işareti. Bu nedenle, WebView'u başlatan ve OAuth akışını başlatan bir SignInActivity oluşturdum. Bu, my-custom-scheme://callback geri çağrısı WebView algıladığında, code querystring parametresini alır ve akışı tamamladığında, iyi çalışır. WebView kullanmanın dezavantajı, kullanıcı zaten tarayıcıda aktif bir oturuma sahip olsa bile, bu oturum WebView'da kullanılmamaktadır, böylece kullanıcının WebView numaralı telefondan tekrar giriş yapması gerekecektir.

Bunu çözmek için, böyle, AndroidManifest.xml bir intent-filter kullanarak geçiş çalıştı:

<intent-filter> 
    <action android:name="android.intent.action.VIEW" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 
    <data android:scheme="my-custom-scheme" android:path="callback"/> 
</intent-filter> 

Yerine SignInActivity bir WebView açarak Sonra bir tarayıcı niyet başlatıp vurmak için tarayıcı için bekleyin my-custom-scheme://callback. Bu işleri

if (intent != null && intent.getData() != null && getString("my-custom-scheme").equals(intent.getData().getScheme())) { 
    String code = getIntent().getData().getQueryParameter("code"); 
    // complete oauth flow 
} 

: Benim SignInActivity yılında

Intent browserIntent = new Intent(Intent.ACTION_VIEW, "http://oauth2provider/authorize"); 
startActivity(browserIntent); 
finish(); 

Ben geri arama işlemek için aşağıdaki kodu var. Ama, sorunun (nihayet!) için :

  1. kullanıcı oturum değilse, tarayıcı niyet oauth sağlayıcı oturum açma sayfası görüntülenecektir. Kullanıcı oturum açtıktan sonra, Chrome benim özel şemamıma yönlendirilecek: // geri arama ve amaç için SignInActivity başlatılacak. Bu etkinlik görünmez olduğu için, tarayıcı sayfada oturum açmada kalacaktır ve kullanıcı hiçbir şey olmamış gibi görünecektir. Tarayıcı asla kapanmaz.
  2. Kullanıcı önceden oturum açmışsa, oauth sağlayıcısı doğrudan özel programım: // geri çağrısına yönlendirilir. Bu durumda, tarayıcı sekmesi otomatik olarak kapatılır, ancak tarayıcının kendisi açık kalır (hiçbir sekme görünmeden).

Yani benim soru: olup orada zaten benim-özel şemaya yönlendirildi sonra tarayıcı farklı davranır yapmak için: // geri arama? İdeal olarak, geri dönüşüme yeniden yönlendirildikten ve etkinlik yığındaki bir önceki etkinliğe (yani, SignInActivity başından itibaren başlayan aktiviteye) döndükten sonra kapatmak istiyorum.

cevap

4

Aynı sorunu gidermek için bir sonraki yaklaşımı kullandım.

Sign In düğmesiyle MainActivity ürünümüzün olduğunu varsayalım. Bunun yerine tarayıcısını doğrudan bu düğmeye tıklayarak başlatıyorum SignInActivitystartActivityForResult yöntemini kullanarak başlatıyorum. O zaman kullanmak için giriş akışının sonucunu halledebilirim.

SignInActivity

startActivityForResult(new Intent(this, SignInActivity.class), requestCode);

sorumludur:

    giriş sayfası ile
  • açık tarayıcı
  • yakalamak kullanılarak custom-scheme://callback
  • bitiş giriş işlemi yönlendirme belirteci
  • dönüş sonucu geri yönlendirilecektir url alınan MainActivity
  • @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.login); 
    
        if (intent != null && intent.getData() != null && "custom-scheme".equals(intent.getData().getScheme())) { 
         String code = getIntent().getData().getQueryParameter("code"); 
         // complete oauth flow 
        } else { 
         Intent browserIntent = new Intent(Intent.ACTION_VIEW, "http://oauth2provider/authorize") 
          .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND); 
         startActivity(browserIntent); 
         finish(); 
        } 
    } 
    

    tarayıcı amacı hakkında belirlenen bayrakları İtiraf: gibi

Yani, onun onCreate yöntem görünüyor.

SignInActivityMainActivity'dan açılmışsa, sadece tarayıcıda giriş sayfasını açar ve eğer yönlendirme URL'si alınıyorsa, uygun istek göndererek giriş akışını tamamlar. aşağıdakileri yapmanız gerekir, geri arama yönteminde bazı bitiş noktasına kodu gönderme tamamladıktan giriş işlemi sonrasında

:

setResult(Activity.RESULT_OK); 
this.finish(); 

Doğal olarak, bu uç noktadan ACCESS_TOKEN alırlar. Burada bir yerde, başarılı bir şekilde geri aramada saklayabilir veya orada işlemek için MainActivity'a geri döndürebilirsiniz.

SignInActivity için düzen olarak sayfanın ortasındaki sadece ProgressBar numaralı telefonu kullanabilirsiniz. SignInActivity'un yakalanmış yönlendirme URL'si (custom-scheme://callback) açıldıktan sonra oturum açma akışı tamamlandığında görünecektir. İşte

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
> 

    <ProgressBar 
     android:layout_width="48dp" 
     android:layout_height="48dp" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
    /> 
</RelativeLayout> 

AndroidManifest.xml

<activity android:name=".SignInActivity" 
      android:launchMode="singleTask" 
      android:noHistory="true" 
    > 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <category android:name="android.intent.category.BROWSABLE"/> 
     <data android:scheme="custom-scheme" android:host="callback"/> 
    </intent-filter> 
</activity> 
içinde SignInActivity ilanıdır