2

Je lisais sur le site de développement Android à propos de l'utilisation des réflexions. Mais je ne sais vraiment pas comment l'utiliser. J'ai besoin de ce fichier Java pour fonctionner sur un périphérique 1.5 (SDK3), mais ignorez simplement le nouveau code et cela fonctionne très bien sur un téléphone 2.0 (SDK5) ou plus tard. J'ai cette activité (posté ci-dessous) et c'est un simple webview. Cependant, je veux que la géolocalisation soit activée (même si ce n'est que pour les téléphones 2.0 et ultérieurs), puisque ces API n'ont pas été introduites avant le SDK 5, et je voudrais que la webview puisse, à tout le moins, charger sur un téléphone 1,5 plutôt que de s'écraser. Comment puis-je prendre mon code et le configurer en utilisant des réflexions?Utilisation de la réflexion dans Android pour une compatibilité descendante

package com.my.app; 

    import com.facebook.android.R; 
    //NEEDS TO BE IGNORED********************************************************** 
    import android.webkit.GeolocationPermissions; 
    import android.webkit.GeolocationPermissions.Callback; 
    //END************************************************************************** 
    import android.app.Activity; 
    import android.app.ProgressDialog; 
    import android.content.Intent; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.KeyEvent; 
    import android.view.Menu; 
    import android.view.MenuInflater; 
    import android.view.MenuItem; 
    import android.webkit.CookieSyncManager; 
    import android.webkit.WebChromeClient; 
    import android.webkit.WebView; 
    import android.webkit.WebViewClient; 
    import android.widget.Toast; 

    //GeolocationPermissionsCallback NEEDS TO BE IGNORED********************************************************** 
    public class Places extends Activity implements GeolocationPermissions.Callback { 
     private ProgressDialog progressBar; 
     public WebView webview; 
     private static final String TAG = "Main"; 
     String geoWebsiteURL = "http://google.com"; 

     @Override 
     public void onStart() 
     { 
      super.onStart(); 
      CookieSyncManager.getInstance().sync(); 
     } 

     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      CookieSyncManager.createInstance(this); 
      CookieSyncManager.getInstance().startSync(); 

      webview = (WebView) findViewById(R.id.webview); 
      webview.setWebViewClient(new testClient()); 
      webview.getSettings().setJavaScriptEnabled(true); 
      webview.getSettings().setPluginsEnabled(true); 
      webview.loadUrl("http://google.com"); 

      progressBar = ProgressDialog.show(Places.this, "", "Loading Page..."); 

      //START GROUP OF CODE THAT NEEDS TO BE IGNORED************************************************************ 
      webview.getSettings().setGeolocationEnabled(true); 

      GeoClient geo = new GeoClient(); 
      webview.setWebChromeClient(geo); 
     } 

     public void invoke(String origin, boolean allow, boolean remember) { 

     } 

     final class GeoClient extends WebChromeClient { 

      @Override 
      public void onGeolocationPermissionsShowPrompt(String origin, 
      Callback callback) { 
       super.onGeolocationPermissionsShowPrompt(origin, callback); 
       callback.invoke(origin, true, false); 
      } 

    //END OF CODE THAT NEEDS TO BE IGNORED************************************************ 
    } 

    private class testClient extends WebViewClient { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      Log.i(TAG, "Processing webview url click..."); 
      view.loadUrl(url); 
      return true; 
     } 

     public void onPageFinished(WebView view, String url) { 
      Log.i(TAG, "Finished loading URL: " +url); 
      if (progressBar.isShowing()) { 
       progressBar.dismiss(); 
      } 

      if (url.startsWith("mailto:") || url.startsWith("geo:") || 
       url.startsWith("tel:")) { 

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

     //What's here???? 

     public boolean onKeyDown(int keyCode, KeyEvent event) { 
      if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { 
       webview.goBack(); 
       return true; 
      } 
      if (keyCode == KeyEvent.KEYCODE_SEARCH) { 
       Intent z = new Intent(this, Search.class); 
       startActivity(z); 
      } 
      return super.onKeyDown(keyCode, event); 
     } 

     public boolean onCreateOptionsMenu (Menu menu) { 
      super.onCreateOptionsMenu(menu); 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.menu, menu); 
      return true; 
     } 

     @Override 
     public boolean onOptionsItemSelected (MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.home: 
        Intent m = new Intent(this, Home.class); 
        startActivity(m); 
        return true; 

       case R.id.refresh: 
        webview.reload(); 
        Toast.makeText(this, "Refreshing...", Toast.LENGTH_SHORT).show(); 
        return true; 
      } 
      return false; 
     } 

     public void onStop() 
     { 
      super.onStop(); 
      CookieSyncManager.getInstance().sync(); 
     } 
    } 

Répondre

1

Étape # 1: Ne pas mettre en œuvre GeolocationPermissions.Callback sur l'activité. Utilisez un autre objet pour GeolocationPermissions.Callback, un implémenté dans une classe Java publique que vous ne chargeriez pas si vous exécutez des versions plus anciennes du système d'exploitation. Etape # 2: Lisez les réponses et les commentaires sur le the question you asked previously, qui couvre ce que vous devez savoir pour le reste. Notamment, vous feriez GeoClient être une classe Java publique dans son propre fichier, de sorte que vous pouvez éviter de le charger sur les anciennes versions du système d'exploitation. Personnellement, j'aime la réponse de Stephen C, et je démontre son utilisation here.

Questions connexes