1

私はhttp://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.htmlを読んでいましたが、特定のコード行を無視する方法を実際には理解していません。私はこのアクティビティ(以下に投稿)を持っており、それは単純なWebビューです。ただし、ジオロケーションを有効にしたいのですが(2.0以降の電話のみの場合でも)、これらのメソッドはSDK 5(android 2.0)まで導入されておらず、少なくともWebビューで有効にできるようにしたいと考えています。クラッシュするだけでなく、1.5台の電話にロードできます。誰かがこのコードを取得して、ユーザーの電話SDKがSDK 5よりも少ないときにスター付きのコメントで指摘したコード行を無視する方法を教えてもらえますか?

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();

        }




} 
4

1 に答える 1

2

あなたの問題には(少なくとも)2つの可能な解決策があります:

  1. OSごとに異なるバージョン-OSごとにソフトウェアの異なるビルドを作成します。これは一般的なアプローチであり、多くのオープンソースプロジェクトは、Linux、Windows、MacOS用にさまざまなビルドを提供しています。あなたのケースは似ています、あなたはアンドロイド1.5、2.0、...のために異なるビルドを作成することができます

  2. すべてのAndroidOSに1つのバージョン-実行時にOSのバージョンを検出する方法を見つけることができれば、別のOSで実行するようにコードを再設計できます。Android 1.6および2.0用の特別なクラスを追加して、正しいクラスのみが読み込まれるようにすることができます。

コードの簡単な例:

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

    // ... 

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

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

Android20Util次のような静的メソッドが含まれています。

public static void enableGeolocation(WebView webview) {
    webview.getSettings().setGeolocationEnabled(true);
    webview.setWebChromeClient(new GeoClient());
}
于 2010-08-24T05:53:48.070 に答える