Autore Topic: Problema con minSDKversion  (Letto 522 volte)

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Problema con minSDKversion
« il: 24 Marzo 2015, 12:18:48 CET »
0
Salve ragazzi,
devo sviluppare un'applicazione che consente di fare login, registrazione ed altre operazioni che comportano degli INSERT su un DB mysql creato su un server.

Ho seguito questo tutorial -> Android Login and Registration with PHP, MySQL and SQLite

ma ora ho un problema : quando vado sostituire nel manifest
    <uses-sdk android:minSdkVersion="8" />
con
    <uses-sdk android:minSdkVersion="11" />

l'applicazione crasha.
Come posso risolvere questo problema?
Grazie per l'aiuto.

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Problema con minSDKversion
« Risposta #1 il: 24 Marzo 2015, 12:28:32 CET »
0
Dalla tua descrizione non mi è possibile capire il problema, potresti postare il LOGCAT dell'errore?

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Problema con minSDKversion
« Risposta #2 il: 24 Marzo 2015, 13:10:34 CET »
0
Ciao Questo è il logcat :
03-24 13:09:14.345: E/AndroidRuntime(24294): FATAL EXCEPTION: main
03-24 13:09:14.345: E/AndroidRuntime(24294): Process: it.reply.Profilazione, PID: 24294
03-24 13:09:14.345: E/AndroidRuntime(24294): android.os.NetworkOnMainThreadException
03-24 13:09:14.345: E/AndroidRuntime(24294):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at java.net.InetAddress.lookupHostByName(InetAddress.java:423)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at java.net.InetAddress.getAllByName(InetAddress.java:215)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at it.reply.Profilazione.library.JSONParser.getJSONFromUrl(JSONParser.java:58)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at it.reply.Profilazione.library.UserFunctions.loginUser(UserFunctions.java:50)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at it.reply.Profilazione.LoginActivity$1.onClick(LoginActivity.java:64)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at android.view.View.performClick(View.java:4763)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at android.view.View$PerformClick.run(View.java:19821)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at android.os.Handler.handleCallback(Handler.java:739)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at android.os.Handler.dispatchMessage(Handler.java:95)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at android.os.Looper.loop(Looper.java:135)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at android.app.ActivityThread.main(ActivityThread.java:5274)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at java.lang.reflect.Method.invoke(Native Method)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at java.lang.reflect.Method.invoke(Method.java:372)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
03-24 13:09:14.345: E/AndroidRuntime(24294):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)



da un debug ho capito che l'istruzione :
         HttpResponse httpResponse = httpClient.execute(httpPost);
con la versione minSDKversion = 11 non funziona.

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Problema con minSDKversion
« Risposta #3 il: 24 Marzo 2015, 13:22:36 CET »
0
android.os.NetworkOnMainThreadException
E' la chiave, evidentemente non puoi fare quell'operazione sul Thread principale (UI Thread).
Esegui l'operazione in un AsyncTask.

Questa modifica c'è dalla versione 10 delle API.

Saluti.

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Problema con minSDKversion
« Risposta #4 il: 24 Marzo 2015, 13:30:46 CET »
0
Ciao LinkOut, innanzitutto grazie per l'aiuto, quindi dovrei inserire questa classe :
Codice: [Seleziona]
public class JSONParser {

        static InputStream is = null;
        JSONObject jObj = null;
        static String json = "";

        // constructor
        public JSONParser() {}

        /*Funzione per il recupero dei dati*/
        public JSONObject getJSONFromUrl(String url, List<NameValuePair> params)
        {
                // Making HTTP request
                try {
                        // defaultHttpClient
                        // Inizializzazione della connessione HTTP
                        DefaultHttpClient httpClient = new DefaultHttpClient();
                        HttpPost httpPost = new HttpPost(url);
                        httpPost.setEntity(new UrlEncodedFormEntity(params));
                        HttpResponse httpResponse = httpClient.execute(httpPost);
                        HttpEntity httpEntity = httpResponse.getEntity();
                        is = httpEntity.getContent();
                } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                } catch (ClientProtocolException e) {
                        e.printStackTrace();
                } catch (IOException e){
                        e.printStackTrace();
                }
                try {
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null)
                                sb.append(line + "\n");
                       
                        is.close();
                        json = sb.toString();
                       
                } catch (Exception e) {
                        Log.e("Buffer Error", "Error converting result " + e.toString());
                }try {
                        /*Creo un oggetto JSON contenenre le stringhe appena lette*/
                        jObj = new JSONObject(json);       
               
                } catch (JSONException e) {
                        Log.e("JSON Parser", "Error parsing data " + e.toString());
                }
                return jObj;

        }
}

in un asynctask?
Posso chiederti come mai ?scusa ma non sono molto esperta.
Grazie ancora

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Problema con minSDKversion
« Risposta #5 il: 24 Marzo 2015, 13:32:18 CET »
0
No dovresti eseguire le operazioni che riguardano il Network  in un task asincrono : AsyncTask | Android Developers

EDIT: Magari questo esempio ti può aiutare

Codice (Java): [Seleziona]
    private class EsempioTaskAsync extends AsyncTask<Void,Void,Void>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //Eventuali operazioni prima della comunicazione con il WS.
        }
       
        @Override
        protected Void doInBackground(Void... params) {
            //Esegui le operazioni di comunicazione con il WS qui.
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            //Puoi farti arrivare qui il risultato dell'operazione (usando i parametri) e trattarlo di conseguenza (onPostExecute viene eseguito a operazione conclusa)
        }
    }
« Ultima modifica: 24 Marzo 2015, 13:39:05 CET da LinkOut »

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Problema con minSDKversion
« Risposta #6 il: 24 Marzo 2015, 16:11:40 CET »
0
Ciao LinkOut,
grazie ancora per la disponibilità.
Seguendo le tue indicazioni ho modificato il codice nel seguente modo :

Codice (Java): [Seleziona]
class JSONParser extends AsyncTask<String, Void, JSONObject> {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // variables passed in:
    String url;
    String method;
    List<NameValuePair> params;

    // constructor
    public JSONParser(String url, String method,
        List<NameValuePair> params) {
        this.url = url;
        this.method = method;
        this.params = params;
    }


    @Override
    protected JSONObject doInBackground(String... args) {
        try {
            if(method == "POST"){
                DefaultHttpClient httpClient = new DefaultHttpClient();
                httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.ACCEPT_ALL);// BROWSER_COMPATIBILITY);
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            } else if(method == "GET"){
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Fehler!", "Fehler mein umwandeln von Stream in String: " + e.toString());
        }

        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        return jObj;
    }

    @Override
    protected void onPostExecute(JSONObject obj) {
        // Now we have your JSONObject, play around with it.
    }      
}


mente per richiamare da un'altra classe ho implementato :
Codice (Java): [Seleziona]
JSONParser task = new JSONParser(serverURL, method ,params);
task.execute(new String[] { serverURL });
               
JSONObject json = task.jObj;

ma il json risulta sempre null.
« Ultima modifica: 24 Marzo 2015, 17:02:37 CET da Raffyna »

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Problema con minSDKversion
« Risposta #7 il: 24 Marzo 2015, 17:01:09 CET »
0
Ciao, Non riesco a capire cosa vuoi fare, mi sembra che stai copiando codice qua e la a caso perchè in quello che hai postato ci sono tantissimi problemi ed errori.
Se provi a spiegare quello che vuoi fare magari ti posso aiutare a risolvere il tuo problema.

Grazie.

Post unito: [time]24 Marzo 2015, 17:15:21 CET[/time]
Ecco un altro esempio: (forse ho capito cosa vuoi fare)

Questa è una classe che ho chiamato ServiceHandler, che si occupa di "parlare con il WS"

Codice (Java): [Seleziona]
public class ServiceHandler {

    static String response = null;
    public final static int GET = 1;
    public final static int POST = 2;

    public ServiceHandler() {
    }

    public String makeServiceCall(String url, int method) {
        return this.makeServiceCall(url, method, null);
    }

    public String makeServiceCall(String url, int method, List<NameValuePair> params) {
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpEntity httpEntity;
            HttpResponse httpResponse;

            if (method == POST) {
                HttpPost httpPost = new HttpPost(url);
                if (params != null) {
                    httpPost.setEntity(new UrlEncodedFormEntity(params));
                }
                httpResponse = httpClient.execute(httpPost);
            } else {
                if (method == GET) {
                    if (params != null) {
                        String paramString = URLEncodedUtils.format(params, "utf-8");
                        url += "?" + paramString;
                    }
                    HttpGet httpGet = new HttpGet(url);
                                       
                    httpResponse = httpClient.execute(httpGet);
                   // Eventuali controlli sulla response qui
                    httpEntity = httpResponse.getEntity();
                    response = EntityUtils.toString(httpEntity);
                }
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }
}


Dall'esterno invece:
Codice (Java): [Seleziona]
ServiceHandler sh = new ServiceHandler();
String result = sh.makeServiceCall("URLQUI",nServiceHandler.GET); //In questo caso per la GET
« Ultima modifica: 24 Marzo 2015, 17:20:07 CET da LinkOut »

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Problema con minSDKversion
« Risposta #8 il: 24 Marzo 2015, 17:24:57 CET »
0
Ciao, sotto tuo suggerimento sto provando ad eseguire in background, con asynctask, i metodi di connessione per questo ho implementato le istruzioni di connessione nel metodo doInBackground.
Potresti indicarmi le sezioni di codice errate?
Grazie.

Offline LinkOut

  • Utente normale
  • ***
  • Post: 272
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Problema con minSDKversion
« Risposta #9 il: 24 Marzo 2015, 17:30:23 CET »
0
Secondo me, dovresti dividere le cose il più possibile.

1. - Avere una classe come "Service Handler" che "parla" all'esterno
2. - Avere una classe che chiama "Service Handler" e dal risultato ottenuto, ti genera l'oggetto desiderato.
3. - Avere una classe che estende Async, la quale nel metodo doInBackground, chiama il punto 2 che chiama il punto 1, restituendoti l'oggetto desiderato.
4. - Usa l'oggetto dove vuoi.

Così secondo me ti semplifichi molto la vita almeno separi il più possibile le cose.