2015-10-15 24 views
9

Şu anda webView ile bir android uygulaması geliştiriyorum.Bir webView URL'sinde niyet: // nasıl ele alınır?

if(url.startsWith("something")){ 
//do something 
return true; 
} 

Sorunum:

Bazı URLS örneğin google aramasında, URL şema vardır:

bazı urls ben oldukça yalındır shouldOverrideUrlLoading yöntemi kullanmak gerekir
intent://en.m.wikipedia.org/wiki/Test_cricket#Intent;scheme=http;package=org.wikipedia;S.browser_fallback_url=https%3A%2F%2Fwww.google.pt%2Fsearchurl%2Fr.html%23app%3Dorg.wikipedia%26pingbase%3Dhttps%3A%2F%2Fwww.google.pt%2F%26url%3Dhttps%3A%2F%2Fen.m.wikipedia.org%2Fwiki%2FTest_cricket;S.android.intent.extra.REFERRER_NAME=https%3A%2F%2Fwww.google.pt;launchFlags=0x8080000;end 

kullanıyorum denedim:

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
startActivity(browserIntent); 

Ama bir hata var: Ben URL düzeni Bu tarz gerektiğini nasıl

10-15 15:18:15.546: W/System.err(29086): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=intent://en.m.wikipedia.org/wiki/Test_cricket } 

?


GÜNCELLEME:

Intent myIntent = new Intent().parseUri(url, Intent.URI_INTENT_SCHEME); 
startActivity(myIntent); 

: @CommonsWare açıklamalarının ardından

, ben böyle bir şey URL bir Intent object oluşturmak ve sonra startActivity() denemek için Intent üzerinde parseUri() kullanarak denedim Ama yine de:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://en.m.wikipedia.org/wiki/Test_cricket flg=0x8080000 pkg=org.wikipedia (has extras) } 

Yönergeler yanlış yazılmış olabilir veya @CommonsWare belirtilen intent yapamıyorum. Intent'un nasıl oluşturulacağına dair ipuçları var mı?

+1

Ya 'ActivityNotFoundException' yakalamak veya kullanmak' PackageManager' ve 'resolveActivity()' çağırmadan önce bu durumu tespit etmek için 'startActivity()'. Bu durumda, "Uri" bir uygulama (Wikipedia), ve eğer bu uygulama yüklenmemişse, "Intent" çözülmez. Bu gerçeği belirten kullanıcıya bir çeşit hata mesajı sunmanız gerekecektir. – CommonsWare

+0

@CommonsWare Bazı tarayıcılar (Firefox, Chrome, Opera) üzerinde uygulamayı açmak için "intent: // ..." ile bir bağlantıya hafifçe dokunursanız, uri'yi varsayılan tarayıcıya yönlendirmenin bir yolu vardır o ? –

+0

Varsayılan tarayıcı onu idare etmiyor - Wikipedia uygulaması gerekiyor. Yine de, şimdi düşünüyorum, ACTION_VIEW muhtemelen doğru cevap değil. URL'den bir 'Intent' nesnesi oluşturmak için 'Intent'te parseUri() 'yi kullanın, daha sonra' Intent'te 'startActivity()' seçeneğini kullanın. – CommonsWare

cevap

14

Bu amaç URL'sinin yapısı burada açıklanmıştır https://developer.chrome.com/multidevice/android/intents.

yüzden böyle iç WebView'da şeyin üstesinden gelebilecek:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if (url.startsWith("intent://")) { 
     try { 
      Context context = view.getContext(); 
      Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 

      if (intent != null) { 
       view.stopLoading(); 

       PackageManager packageManager = context.getPackageManager(); 
       ResolveInfo info = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); 
       if (info != null) { 
        context.startActivity(intent); 
       } else { 
        String fallbackUrl = intent.getStringExtra("browser_fallback_url"); 
        view.loadUrl(fallbackUrl); 

        // or call external broswer 
//     Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(fallbackUrl)); 
//     context.startActivity(browserIntent); 
       } 

       return true; 
      } 
     } catch (URISyntaxException e) { 
      if (GeneralData.DEBUG) { 
       Log.e(TAG, "Can't resolve intent://", e); 
      } 
     } 
    } 

    return false; 
} 
+0

Mükemmel! Sonunda bir çözüm –

3

Bunu çözmeyi başardığım yol zarif değil, ancak çalışıyor. değilse, biz return false (tıkla görmezden), //everything until# ve Intent.ACTION_VIEW iletecek:

Önce url intent:// ilestartsWith ve scheme=http içeriyorsa eğer öyleyse, biz doğru niyet sonra değer elde, kontrol .
Böyle twitter, facebook, google ve wikipedia haritalar ve sorunsuz çalıştı gibi google mobil arama birkaç sonuçlarıyla bu çözümü test ettik. Eğer daha iyi bir çözüm bıraktıysanız

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if(url.startsWith("intent://") && url.contains("scheme=http")){ 
     url = Uri.decode(url); 
     String bkpUrl = null; 
     Pattern regexBkp = Pattern.compile("intent://(.*?)#"); 
     Matcher regexMatcherBkp = regexBkp.matcher(url); 
     if (regexMatcherBkp.find()) { 
      bkpUrl = regexMatcherBkp.group(1); 
      Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://"+bkpUrl)); 
      startActivity(myIntent); 
      return true; 
     }else{ 
      return false; 
     } 
    } 
return false; 
} 

, duymak istiyorum.
Destek için özellikle teşekkürler, CommonsWare.

İlgili konular