AJAX şi Android 4.1 sau 4.2


După cum spuneam într-un alt articol, am avut o problemă ce mi-a mâncat timp, nervi… Mai exact am scris o aplicaţie pentru Android dar am primit informaţii că nu merge pe ultimele versiuni. Eu am pe tabletă Android 4.0 pe care codul rula, dar în sus, adică 4.1 şi 4.2 (la această oră) mi se spunea că nu merge. Până la urmă mi-a venit ideea să văd cu ochii meu cu un emulator pentru 4.1/2. Şi într-adevăr am văzut: nu mergea. Acelaşi cod care de la Android 2.2 până la Android 4.0 mergea, în versiuni mai noi dădea eroare. Am săpat, am pus întrebări… dar nimic. Până la urmă am găsit totuşi într-un colţ al internetului funcţia salvatoare.

imagine

De fapt e vorba de o metodă a clasei WebSettings: getAllowUniversalAccessFromFileURLs.  A fost introdusă doar începând cu Android 4.1/2, adică de la API 16 în sus, ca o măsură suplimentară de protecţie. Dacă doreşti să poţi accesa fişiere locale sau url-uri de pe internet trebuie să pui pe true. Atât. Dar problemele nu s-au oprit totuşi aici. De ce? Pentru că această metodă nu există pentru API-urile inferioare, ori eu doresc ca aplicaţia mea să meargă şi pentru Android 2.2 şi tot aşa până la Android 4.0. Care e oare soluţia? Să facem o aplicaţie pentru 2.2-4.0 şi alta pentru 4.1-4.2? Clar nu! :)

Am săpat din nou pe internet şi până la urmă am văzut că se sugerează separarea liniei cu metoda amintită într-o funcţie, pe care dacă o prefixăm cu @TargetApi(16) practic spunem compilatorului să nu bage în seamă acele linii decât dacă e Android 4.1 sau 4.2. Iar apelarea funcţiei am condiţionat-o tot de versiunea curentă de Android, pe care am aflat-o din android.os.Build.VERSION.SDK_INT, valorile fiind descrise aici. Drept urmare în clasa cu activitatea principală am ceva de genul (trebuie mici modificări după cum e aplicaţia proprie):

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    WebView webView;
    
    @Override
    public void onBackPressed()
    {
        if(webView.canGoBack())
            webView.goBack();
        else
            super.onBackPressed();
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView);
        webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        webView.getSettings().setJavaScriptEnabled(true);
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (currentapiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN){
        	pentruJellyBean(webView);
        }
        webView.setWebChromeClient(new WebChromeClient());
        webView.loadUrl("file:///android_asset/www/index.html");
    }
    
    @TargetApi(16)
    protected void pentruJellyBean(WebView webView) {
        try {
            webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        } catch(NullPointerException e) {
        }
    }
}


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (4 evaluări, media: 5,00 din 5)
Loading...Loading...

0 comentarii


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *