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();
}
}
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
@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) –