1

Je lisais sur http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html Mais je ne sais vraiment pas comment ignorer certaines lignes de code. 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 plus), puisque ces méthodes n'ont pas été introduites avant SDK 5 (android 2.0) et je voudrais que la webview puisse au moins être capable de charger sur un téléphone 1,5 plutôt que de s'écraser. Quelqu'un peut-il me montrer comment prendre ce code et lui faire ignorer les lignes de code que j'ai souligné avec les commentaires étoilés lorsque le SDK de l'utilisateur est inférieur au SDK 5?Comment faire pour ignorer certaines méthodes et le code dans une classe? Basé sur SDK

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..."); 

     //THIS 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); 
        } 
     } 
    } 



     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

2

Il y a (au moins) deux solutions possibles pour votre problème:

  1. Différentes versions pour différents OS - créer différents builds de votre logiciel pour différents OS. C'est une approche courante, beaucoup de projets open source proposent différentes versions pour linux, windows, mac os. Votre cas est similaire, vous pouvez créer différents builds pour Android 1.5, 2.0, ...

  2. Une version pour tous les OS Android - Si vous pouvez trouver un moyen de détecter la version du système d'exploitation lors de l'exécution, puis Vous pouvez redessiner votre code pour l'exécuter sur un autre système d'exploitation. Vous pouvez ajouter des classes spéciales pour android 1.6 et 2.0 et assurez-vous que seules les classes correctes sont chargées.

Un exemple rapide pour votre code:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // ... 

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

    if (isGeolocationAvailable()) { 
     Android20Util.enableGeolocation(webview); 
    }   
} 

Android20Util contient des méthodes statiques, comme:

public static void enableGeolocation(WebView webview) { 
    webview.getSettings().setGeolocationEnabled(true); 
    webview.setWebChromeClient(new GeoClient()); 
} 
+0

Je fondamentalement juste besoin de la classe au moins être capable de charger sur une 1,5 téléphone. Je n'en ai pas nécessairement besoin pour que la géolocalisation fonctionne. Comment pourrais-je faire l'option 2? Est-ce qu'il y a une manière que je pourrais juste faire deux classes différentes et l'ai alors seulement charger cette classe pour les téléphones 2.0 et vers le haut? puis charger la classe alternative pour 1,5 1,6? – brybam

+0

@brybam - avec la solution 2 vous distribuer toutes les classes à chaque android. Donc l'application pour un android 1.5 aurait des classes incompatibles, mais elles ne seront jamais chargées/utilisées. C'est le compromis: vous n'avez pas besoin de faire des builds séparés mais vous ajoutez des données inutilisées à l'application. [Voici un problème similaire avec certaines solutions] (http://stackoverflow.com/questions/3530721/dynamic-class-loading-to-target-multiple-android-versions) –