2016-03-18 22 views
8

Bir Android Chrome Özel Sekmesi ile bir OAuth2 akışı uygulamaya çalışıyorum ancak Chrome Özel Sekmesi 302 konumla aldığında uygulamam her zaman kapalı (kilitlenme yok)/Uygulamamın şeması.Android uygulamasına Chrome Özel Sekmeleri yönlendirmesi, uygulamayı kapatır

Ahref bağlantısı olan bir HTML sayfası oluşturup üzerinde manuel olarak dokunursam Chrome Özel Sekmesi, uygulamanıza doğru şekilde geçiyorsa.

Chrome Özel Sekmesinde sunucu 302 yönlendirme işleminde olduğu gibi özel uygulama şemamı doğru şekilde işlemez ... ama neden?

Bir stok tarayıcısında veya WebView ile aynı yönlendirme URL'sini denediğimde her şey çalışıyor. Bu uygulama, HTTP 302 koduyla alınan yönlendirme URL

Button btnChromeCustomTab = (Button) findViewById(R.id.btnChromeCustomTab); 
    btnChromeCustomTab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build(); 
      String packageName = CustomTabsHelper.getPackageNameToUse(MainActivity.this); 
      customTabsIntent.intent.setPackage(packageName); 
      Uri theLocationUri = Uri.parse(URL); 
      customTabsIntent.launchUrl(MainActivity.this, theLocationUri); 
     } 
    }); 

AndroidManifest.xml

<activity android:name=".MainActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <intent-filter android:label="@string/filter_title"> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="myappscheme" android:host="oauth" /> 
     </intent-filter> 
    </activity> 

MainActiviy.java: Burada

benim şimdiki kurulumdur

myappscheme: // oauth? Code = 1234567 & state = t okenCheck123

build.gradle herhangi bir yardım için

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.2" 

defaultConfig { 
    applicationId "de.myapptest.webviewtest" 
    minSdkVersion 16 
    targetSdkVersion 23 
    versionCode 1 
    versionName "1.0" 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.2.1' 
    compile 'com.android.support:design:23.2.1' 
    compile 'com.android.support:customtabs:23.0.0+' 
} 

Teşekkür ...

+1

Anladığım kadarıyla uygulamanız devam ediyor ve kapatılıyor, doğru mu? Logcat'ta alakalı bir mesaj var mı? Ayrıca, MainActivity.java kodunu gönderebilir misiniz? – andreban

cevap

5

Ben de özel bir şemaya sunucu tarafında sonra 302 yönlendirmeyi benim Android beklenmedik uygulamayı arka plan gözlenen ettik ve beklenen gözlenen bağımsız Chrome'dan işlem ve istemcideki manuel olarak tetiklenen yönlendirme.

Yeniden yönlendiren URL'leri yüklemeden önce warmup işlevini çağırarak sorunu giderebildim.

void launchTab(Context context, Uri uri){ 
    final CustomTabsServiceConnection connection = new CustomTabsServiceConnection() { 
     @Override 
     public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient client) { 
      final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); 
      final CustomTabsIntent intent = builder.build(); 
      client.warmup(0L); // This prevents backgrounding after redirection 
      intent.launchUrl(context, uri); 
     } 
     @Override 
     public void onServiceDisconnected(ComponentName name) {} 
    }; 
    CustomTabsClient.bindCustomTabsService(context, "com.android.chrome", connection); 
} 

Bu işe yaramazsa: Başka bir deyişle

, bu işleri

void launchTab(Context context, Uri uri){ 
    final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); 
    final CustomTabsIntent intent = builder.build(); 
    intent.launchUrl(context, uri); 
} 

Chrome Custom Tab docs en iyi uygulama olarak ısınma tarif, ama aynı zamanda beklenen davranışı sağlamak görünüyor . env açısından

, bir Nexus 5X üzerinde test ediyorum Chrome 51. w Gradle My krom sekmesi bağımlılık şuna benzer:

dependencies { 
    compile 'com.android.support:customtabs:24.0.0' 
+1

Zaten client.warmup (0L) sahibiyim ve uygulamam yine aynı şeyi yapıyor. Başka fikirlerin var mı? – scoleman2272

+1

"com.android.chrome" yerine hangi paket adını vermeliyim. Benim uygulama paketi adı vermeli miyim? – Ajinkya

+0

@Ajinkya, bu paket adı, başlatılacak olan Chrome Özel Sekmeler paketinin adıdır (ör. "Com.android.chrome", "com.browser.that.support.customTabs"). Öyleyse hayır, paket ismini buraya koyma. – Sakiboy

0

Ben başlatmak için kullandığınız Aktivite ayarlamak için bana yardımcı oldu manifest dosyasında SingleInstance moduna CustomTab:

<activity 
     android:launchMode="singleInstance" 
     android:name="com.example.SingleInstanceActivityToStartCustomTab" 
    </activity> 

Ve kodda

ben her zamanki gibi yapın:

CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); 
    final CustomTabsIntent customTabsIntent = builder.build(); 
    customTabsIntent.intent.setPackage(someChromePackage); 
    customTabsIntent.launchUrl(singleInstanceModeActivity, someUriThatDoesRedirect); 

Chrome'u ısıtmayı denedim ve client.warmup(0l); numaralı telefonu aradıktan sonra bir miktar gecikmeyle customTabsIntent.launchUrl() numaralı telefonu arayarak denedim.

0

Android kullanmış olsaydım: launchMode = "singleInstance" görev yöneticisinde birden çok örnek vardı, bu yüzden bu seçenek yoktu.

FLAG_ACTIVITY_NEW_TASK ile CustomTabsIntent'i başlatma Bayrağı yaptı.

CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); 
CustomTabsIntent intent = builder.build(); 

intent.intent.setFlags(FLAG_ACTIVITY_NEW_TASK); 
intent.launchUrl(context, Uri.parse(url)); 
0

Bunun, Chrome'daki bir hatanın sonucu olduğundan eminim. Tüm cihazlarımı (GS6, GS7, Nexus 7 ve Nexus 9) Chrome'un en yeni sürümüne güncelledim ve uygulamanız yeniden yönlendirme gerçekleştiğinde artık en aza indirgeniyor.

Bugün bunu keşfettim (11/3/2016), bu yüzden belirli hatalar veya sonraki çözünürlük hakkında henüz bir bilgim yok. Bu benim fark ettiğim şey.

Bu yardımcı olur umarım!

İlgili konular