Нужна помощь с использованием отражения для обратной совместимости - PullRequest
2 голосов
/ 18 сентября 2010

Я читал документацию для Android по рефлексии, но я не совсем понимаю, как на самом деле использовать ее.Нужно ли создавать несколько файлов классов?Это разбивает его на определенные части в одном файле класса?Я хочу это понять, правда, но я просто не понимаю.

В любом случае, у меня есть этот простой код веб-просмотра, который хочет использовать новый код геолокации из SDK7, но при этом происходит сбой телефонов 1.5 и 1.6.Я действительно хочу, чтобы этот java-класс работал (как минимум при загрузке html), даже если геолокация не будет работать до sdk7.Я поместил комментарии вокруг всего кода, который имеет красную линию под ним в затмении, когда SDK меньше 7. Может ли кто-нибудь возразить, показывая мне с моим кодом, как именно использовать отражение?Я действительно ценю это.Я прочитал болота и документы, и все, что я пытаюсь после их прочтения, не работает.

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



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

        }




    }

1 Ответ

1 голос
/ 18 сентября 2010

Преобразуйте ваш код 7 в отдельный класс, и у вас нет ссылки на этот новый класс в существующем коде.

Затем вам потребуется способ определить, присутствует ли необходимое вам средство.Мне кажется, что вы можете использовать «isroid.webkit.GeolocationPermissions present», что является самым простым, поскольку вы можете использовать Class.forName("android.webkit.GeolocationPermissions"), а затем использовать отражение, чтобы сначала загрузить отдельный класс, который вы написали выше, а затем вызвать метод, который вы хотитебеги в своем классе.Это гарантирует, что ваш код не намекает JVM о том, что ваш отдельный класс даже существует, пока вы не определите во время выполнения, что он вам понадобится.

См. http://www.exampledepot.com/egs/java.lang.reflect/Methods.html для примеров того, как вызывать данныйметод в данном классе, используя отражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...