Autore Topic: lista connessioni ative con ssdi e rssid  (Letto 493 volte)

Offline gfx

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy
  • Sistema operativo:
    ubuntu 14.04
lista connessioni ative con ssdi e rssid
« il: 19 Novembre 2016, 14:05:54 CET »
0
Codice (Java): [Seleziona]
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();


        if(id == R.id.cerca_connessione){

            WifiManager wifiMgr  = (WifiManager) getSystemService(Context.WIFI_SERVICE);

            if(isWifiConnected()){

                wifiMgr.startScan();
                List<WifiConfiguration> wifiScanList = wifiMgr.getConfiguredNetworks();
                wifis = new String[wifiScanList.size()];
                for(int i = 0; i < wifiScanList.size(); i++){
                    wifis[i] = ((wifiScanList.get(i)).toString());
                }
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(FullscreenActivity.this);
                LayoutInflater inflater = getLayoutInflater();
                View convertView = (View) inflater.inflate(R.layout.wifi_list, null);
                alertDialog.setView(convertView);
                alertDialog.setTitle("Avaiable WiFi Connections");
                final ListView lv = (ListView) convertView.findViewById(R.id.WiFiList);
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,wifis);
                lv.setAdapter(adapter);
                alertDialog.show();
                final String[] testName = new String[1];


                lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                            long arg3) {
                        // TODO Auto-generated method stub
                        String text = (String) lv.getItemAtPosition(arg2);
                        Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();

                    }
                });

            }
            else
            {
                Toast.makeText(getApplicationContext(), " Make WiFi -ON- First! ", Toast.LENGTH_SHORT).show();
            }
            return true;
        }
        if(id == R.id.scelta_dispositivo){

In questo modo ottengo una lista degli hotspot salvati sul telefono .... completa di tutti i dati ...

Mentre in realtà vorrei ottenere solo SSID, IP e RSSID(per potere calcolare la potenza del segnale) ...... come posso fare?? ho provato ad usare

Codice (Java): [Seleziona]
List<ScanResult> wifiresult = wifiMgr.getScanResults();
 per poi ciclarlo al fine di ottenere solo come test gli SSID ma ottengo solo una lista tutta con lo stesso nome e ciè il punto di accesso connesso al mio dispositivo ... mentre gli altri non si vedono ...


Grazie
giorgio

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1363
  • Respect: +156
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re: lista connessioni ative con ssdi e rssid
« Risposta #1 il: 19 Novembre 2016, 15:08:26 CET »
+1
Dalla documentazione di startScan() si legge che la disponibilità di risultati viene notificata in futuro. Lo scan é un'operazione che fisicamente richiede del tempo ed é quindi asincrona.
In particolare il sistema manderà un Intent in broadcast con l'action SCAN_RESULTS_AVAILABLE_ACTION.
Devi quindi aspettare di ricevere (tramite BroacastReceiver con IntentFilter adeguato) questo Intent prima di poter leggere una lista completa dei risultati con getScanResulsts().
Postate il LogCat LogCat LogCat LogCat LogCat

Offline gfx

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy
  • Sistema operativo:
    ubuntu 14.04
Re: lista connessioni ative con ssdi e rssid
« Risposta #2 il: 22 Novembre 2016, 13:50:46 CET »
0
@blackgin ...
innanzitutto grazie ...

ho studiato un pò e ho provato a fare questo nel mio main .... (ovviamente scopiazzando un pò di codice in giro)

Codice (Java): [Seleziona]
...........
...........

    private boolean isWifiConnected() {
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        return networkInfo != null && (ConnectivityManager.TYPE_WIFI == networkInfo.getType()) && networkInfo.isConnected();
    }



 class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
            wifiResults.clear();
            wifiList = wifi.getScanResults();
            for(int i = 0; i < wifiList.size(); i++){
                wifiResults.add(wifiList.get(i).toString());
            }
            adapter.notifyDataSetChanged();
        }
    }


    protected void onResume(){
        super.onResume();
        // Register wifi receiver to get the results
        registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

    }

    protected void onPause(){
        super.onPause();
        // Unregister the wifi receiver
        unregisterReceiver(wifiReceiver);

    }



    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();


        if(id == R.id.cerca_connessione){

            if(isWifiConnected()){


                wifiResults=new ArrayList<String>();
                adapter=new ArrayAdapter<String>(this, R.layout.wifi_list,R.id.wifi_name,wifiResults);
                lstView.setAdapter(adapter);
                // Get WifiManager instance
                wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);
                // Create  WifiReceiver instance
                wifiReceiver = new WifiReceiver();
                wifi.startScan();


                onResume();

            }
            else
            {
                onPause();
                wifi.setWifiEnabled(true);
                Toast.makeText(getApplicationContext(), " Your WiFi Was Down " + "\n"  + "\n" + "androidKC1 ENABLE WIFI NOW"   + "\n" + "\n" + "  Try Again!  ", Toast.LENGTH_SHORT).show();
            }
            return true;
        }
        if(id == R.id.scelta_dispositivo){
            Toast.makeText(getApplicationContext(), "Connessioni is selected!", Toast.LENGTH_SHORT).show();
            return true;
        }
.............
.............


ma ricevo questi errori in debug:

Codice: [Seleziona]
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
I/ListPopupWindow: Could not find method setEpicenterBounds(Rect) on PopupWindow. Oh well.
W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
D/AbsListView: Get MotionRecognitionManager
E/MotionRecognitionManager: mSContextService = android.hardware.scontext.ISContextService$Stub$Proxy@2fbc13b
E/MotionRecognitionManager: motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@f5b3617
E/MotionRecognitionManager: motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@f5b3617
D/ViewRootImpl: #1 mView = android.widget.PopupWindow$PopupDecorView{ff28d21 V.E...... ......I. 0,0-0,0}
W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=2
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.office.androidkc1, PID: 29387
                  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
                      at com.example.office.androidkc1.FullscreenActivity.onOptionsItemSelected(FullscreenActivity.java:496)
                      at android.app.Activity.onMenuItemSelected(Activity.java:3204)
                      at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:408)
                      at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:198)
                      at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:107)
                      at android.support.v7.app.AppCompatDelegateImplV9.onMenuItemSelected(AppCompatDelegateImplV9.java:671)
                      at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:817)
                      at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
                      at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:964)
                      at android.support.v7.view.menu.MenuPopup.onItemClick(MenuPopup.java:127)
                      at android.widget.AdapterView.performItemClick(AdapterView.java:345)
                      at android.widget.AbsListView.performItemClick(AbsListView.java:1547)
                      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3821)
                      at android.widget.AbsListView$3.run(AbsListView.java:5841)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7224)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
I/Process: Sending signal. PID: 29387 SIG: 9

Grazie dei consigli ..

Giorgio

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1363
  • Respect: +156
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re: lista connessioni ative con ssdi e rssid
« Risposta #3 il: 22 Novembre 2016, 15:36:25 CET »
+1
Citazione
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
                      at com.example.office.androidkc1.FullscreenActivity.onOptionsItemSelected(FullscreenActivity.java:496)

La ListViewsembra non essere inizializzata.. Hai fatto setContentView con il giusto layout e hai poi inizializzato la ListView con findViewById?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline gfx

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy
  • Sistema operativo:
    ubuntu 14.04
Re: lista connessioni ative con ssdi e rssid
« Risposta #4 il: 23 Novembre 2016, 14:00:21 CET »
0
Codice (Java): [Seleziona]
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();


        if(id == R.id.cerca_connessione){

            if(isWifiConnected()){

                setContentView(R.layout.wifi_list);


                wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);
                wifiResults=new ArrayList<String>();
                adapter=new ArrayAdapter<String>(findViewById(R.id.WiFiList),R.id.wifi_name,wifiResults);
                lstView.setAdapter(adapter);

questo è quello che ho messo nel codice ... l'intenzione è di fare partire la ricerca quando si clicca sulla relativa voce di menù .... quindi:

1-quando l'utente ha cliccato sulla voce menù cerca ->
2-se è attivo il wifi ->
3-eseguo il codice che ho scritto sopra .....uso un array adapter che richiede context, int, int ... quindi giustamente mettendo findViewbyid mi da errore ...... cosa sbaglio nel costruire l'adapter??

Grazie
Giorgio

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1363
  • Respect: +156
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re: lista connessioni ative con ssdi e rssid
« Risposta #5 il: 23 Novembre 2016, 14:19:16 CET »
+1
Citazione
  setContentView(R.layout.wifi_list);
Qua stai cercando di cambiare il layout dell'activity? La ListView su cui cerchi di chiamare .setAdapter, dove la inizializzi?

Comunque: l'adapter vuole un Context, perché cerchi di passare una ListView? Dentro l'Activity puoi passare this come Context, visto che Activity eredita da Context.
Poi immagino tu stia cercando di usare questo costruttore:
Codice (Java): [Seleziona]
ArrayAdapter (Context context,
                int resource,
                int textViewResourceId,
                T[] objects)

Come da )]documentazione devi passare l'id del layout che vuoi usare per ogni elemento della lista (quindi mi aspetto un id del tipo R.layout.xxxx), e poi l'id della TextView all'interno di questo layout in cui andare a scrivere ogni stringa (quindi un R.id.yyyy).
Postate il LogCat LogCat LogCat LogCat LogCat

Offline gfx

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy
  • Sistema operativo:
    ubuntu 14.04
Re: lista connessioni ative con ssdi e rssid
« Risposta #6 il: 23 Novembre 2016, 14:26:54 CET »
0
Ho provato a modificare così .... ma sembra non riesca a prendere la mia lista ....

Codice (Java): [Seleziona]
    class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
            wifiResults.clear();
            wifiList = wifi.getScanResults();
            for(int i = 0; i < wifiList.size(); i++){
                wifiResults.add(wifiList.get(i).toString());
            }
            adapter.notifyDataSetChanged();
        }

    }

    /*public void scanWifi(View view){
        // Scan wifi
        wifi.startScan();

    }*/


    protected void onResume(){
        super.onResume();
        // Register wifi receiver to get the results
        registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

    }

    protected void onPause(){
        super.onPause();
        // Unregister the wifi receiver
        unregisterReceiver(wifiReceiver);

    }



    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();


        if(id == R.id.cerca_connessione){


            if(isWifiConnected()){

                wifiReceiver = new WifiReceiver();


                wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);
                wifiResults=new ArrayList<String>();  /* ma in questo modo utilizzo la classe wifireceiver o no??*/

                final ListView lstView = (ListView) findViewById(R.id.WiFiList);
                final ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, R.layout.wifi_list,R.id.wifi_name, wifiResults);
                lstView.setAdapter(adapter);

                onResume(); /* devo chiamarlo prima di wifiresult??*/
                wifi.startScan(); /* devo chiamarlo prima di onResume o va bene dopo?  ... da quello che ho capito dopo ... prima abilito e poi cerco ... corretto?*/

sempre questo errore ... perchè??

Codice: [Seleziona]
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.bmeccoffice.androidkc1, PID: 21653
                  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
                      at com.example.office.androidkc1.FullscreenActivity.onOptionsItemSelected(FullscreenActivity.java:501)
                      at android.app.Activity.onMenuItemSelected(Activity.java:3204)
                      at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:408)

Grazie
Giorgio
« Ultima modifica: 23 Novembre 2016, 14:31:21 CET da gfx »

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1363
  • Respect: +156
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re: lista connessioni ative con ssdi e rssid
« Risposta #7 il: 23 Novembre 2016, 15:01:23 CET »
+1
Perché la lista continua ad essere nulla.
Sei sicuro che R.id.WiFiList sia l'id corretto della lista e che si trovi nel layout corrente (impostato tramite setContentView)?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline gfx

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy
  • Sistema operativo:
    ubuntu 14.04
Re: lista connessioni ative con ssdi e rssid
« Risposta #8 il: 23 Novembre 2016, 16:36:16 CET »
0
Codice (Java): [Seleziona]
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId(); /*sono nel menu e vedo le voci -- layout menu*/


        if(id == R.id.cerca_connessione){ /*clicco su questa voce*/


            if(isWifiConnected()){

                setContentView(R.layout.wifi_list); /*se siamo connessi allora setto il layout lista ... è corretto??*/

                wifiReceiver = new WifiReceiver();


                wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);
                wifiResults=new ArrayList<String>();  /* ma in questo modo utilizzo la classe wifireceiver o no??*/

                final ListView lstView = (ListView) findViewById(R.id.WiFiList);
                final ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, R.layout.wifi_list,R.id.wifi_name, wifiResults);
                lstView.setAdapter(adapter);

                onResume(); /* devo chiamarlo prima di wifiresult??*/
                wifi.startScan(); /* devo chiamarlo prima di onResume o va bene dopo?  ... da quello che ho capito dopo ... prima abilito e poi cerco ... corretto?*/

questo il mio layout lista (file di nome wifi_list.xml ... vedo ora che la riga LynearLayout non ha la voce android:id .... va bene uguale??):

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

        <ListView
           android:id="@+id/WiFiList"
           android:layout_width="match_parent"
           android:layout_height="wrap_content" >
        </ListView>

</LinearLayout>

il contenuto del layout lista (file di nome wifidiag_layout.xml)
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:id="@+id/wifidiag_layout">

    <TextView
       android:textSize="16sp"
       android:padding="5dp"
       android:layout_gravity="center_vertical"
       android:id="@+id/wifi_name"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:layout_width="0dp" />

    <ImageView
       android:id="@+id/wifi_img"
       android:layout_gravity="center_vertical"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@drawable/wifi_level" />

</LinearLayout>


sbaglio ad impostare i layout??  ... il mio layout principale (quello della activity) si chiama activity_fullscreen.xml con id:fullscreen_content

Post unito: 23 Novembre 2016, 16:43:12 CET
ho provato ad inserire la riga android:id nel file wifi_list.xml ... ma non serve a nulla.......

grazie
giorgio
« Ultima modifica: 23 Novembre 2016, 16:43:13 CET da gfx, Reason: Merged DoublePost »

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1363
  • Respect: +156
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re: lista connessioni ative con ssdi e rssid
« Risposta #9 il: 23 Novembre 2016, 17:36:46 CET »
+1
Codice (Java): [Seleziona]
 setContentView(R.layout.wifi_list); /*se siamo connessi allora setto il layout lista ... è corretto??*/Qua stai cambiando il layout dell'activity, non è così che generalmente si fa (solitamente ad una activity corrisponde un solo layout) e onestamente non l'ho mai fatto, ma in teoria dovrebbe andare bene.

Codice (Java): [Seleziona]
final ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, R.layout.wifi_list,R.id.wifi_name, wifiResults);Qua invece sbagli. Tu gli devi passare il layout di ogni riga della lista, quello (credo) che nel tuo caso hai chiamato wifidiag_layout. A quanto vedo non lo usi da nessuna parte al momento.
Tu invece gli passi wifi_list, che invece è il layout che contiene la lista, non il layout che deve avere ogni suo elemento.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline gfx

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy
  • Sistema operativo:
    ubuntu 14.04
Re: lista connessioni ative con ssdi e rssid
« Risposta #10 il: 23 Novembre 2016, 18:34:58 CET »
0
Ok grazie mille ... ho capito ...

Citazione
Codice (Java): [Seleziona]
 setContentView(R.layout.wifi_list); /*se siamo connessi allora setto il layout lista ... è corretto??*/
Qua stai cambiando il layout dell'activity, non è così che generalmente si fa (solitamente ad una activity corrisponde un solo layout) e onestamente non l'ho mai fatto, ma in teoria dovrebbe andare bene.

quindi quello che mi suggerisci? Può essere che la lista sia visibile all'interno di un "dialog" se creo un dialog con dentro la lista devo comunque usare il comando setcontentview??

Ora il codice funziona meglio... lo ho modificato così:

Codice (Java): [Seleziona]
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId(); /*sono nel menu e vedo le voci -- layout menu*/


        if(id == R.id.cerca_connessione){ /*clicco su questa voce*/


            if(isWifiConnected()){

                setContentView(R.layout.wifi_list); /*se siamo connessi allora setto il layout lista ... è corretto??  pare che possa andare*/

                wifiReceiver = new WifiReceiver();


                wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);
                wifiResults=new ArrayList<String>();  /* ma in questo modo utilizzo la classe wifireceiver o no??  pare di si*/

                final ListView lstView = (ListView) findViewById(R.id.WiFiList);
                final ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, R.layout.wifidiag_layout,R.id.wifi_name, wifiResults); /* hai ragione in questo modo non ottengo l'errore di lista vuota*/
                lstView.setAdapter(adapter);

                onResume(); /* devo chiamarlo prima di wifiresult?? pare vada bene anche qui o no??*/
                wifi.startScan(); /* devo chiamarlo prima di onResume o va bene dopo?  ... da quello che ho capito dopo ... prima abilito e poi cerco ... corretto?pare vada bene anche qui o no??*/

Ora però ricevo un nuovo errore ... credo sia legato al broadcast receiver che ho scopiazzato e al cattivo uso di intent context and adapter.... l'errore riguarda l'uso dell'intent ... a seguire codice broadcast

Codice (Java): [Seleziona]
    class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
            wifiResults.clear();
            wifiList = wifi.getScanResults();
            for(int i = 0; i < wifiList.size(); i++){
                wifiResults.add(wifiList.get(i).toString());
            }
            adapter.notifyDataSetChanged();
        }

    }

relatico codice errore:

Codice: [Seleziona]
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.office.androidkc1, PID: 21221
                  java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS flg=0x4000010 bqHint=4 (has extras) } in com.example.office.androidkc1.FullscreenActivity$WifiReceiver@89c38db
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1003)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7224)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.notifyDataSetChanged()' on a null object reference
                      at com.example.office.androidkc1.FullscreenActivity$WifiReceiver.onReceive(FullscreenActivity.java:452)
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:993)

spero di capire alla fine di questo post il meccanismo degli intent e dei broadcast ..

grazie
Giorgio
« Ultima modifica: 23 Novembre 2016, 18:42:39 CET da gfx, Reason: errore scrittura »

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1363
  • Respect: +156
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re: lista connessioni ative con ssdi e rssid
« Risposta #11 il: 23 Novembre 2016, 19:07:17 CET »
+1
Citazione
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.notifyDataSetChanged()' on a null object reference

L'adapter é nullo quando hai ricevuto l'intent. Sposta l'inizializzazione prima, per esempio nell'onCreate, tanto qua stai creando un adapter con dati vuoti:
Codice (Java): [Seleziona]
final ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, R.layout.wifidiag_layout,R.id.wifi_name, wifiResults);
Postate il LogCat LogCat LogCat LogCat LogCat

Offline gfx

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy
  • Sistema operativo:
    ubuntu 14.04
Re: lista connessioni ative con ssdi e rssid
« Risposta #12 il: 23 Novembre 2016, 20:01:18 CET »
0
Codice: [Seleziona]
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.office.androidkc1, PID: 32035
                  java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS flg=0x4000010 bqHint=4 (has extras) } in com.example.office.androidkc1.FullscreenActivity$WifiReceiver@a282eb6
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1003)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7224)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.notifyDataSetChanged()' on a null object reference
                      at com.example.office.androidkc1.FullscreenActivity$WifiReceiver.onReceive(FullscreenActivity.java:459)
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:993)

spostato l'adapter .... quindi ho questo errore .... ma non è che è sbagliata la classe??

Codice (Java): [Seleziona]
    class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
            wifiResults.clear();
            wifiList = wifi.getScanResults();
            for(int i = 0; i < wifiList.size(); i++){
                wifiResults.add(wifiList.get(i).toString());
            }
            adapter.notifyDataSetChanged();
        }

    }

Grazie giorgio

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1363
  • Respect: +156
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re: lista connessioni ative con ssdi e rssid
« Risposta #13 il: 23 Novembre 2016, 20:10:19 CET »
+1
L'errore é sull'adapter che risulta null quando provi a fare la notifyDataSetChanged. Sei sicuro che sia inizializzato?
Non conosco la logica completa della tua activity, ma se lo inizializzi nell'onCreate e poi lo usi alla ricezione dell'intent non dovresti avere questa eccezione.
Non é che stai usando due variabili "adapter" che si chiamano allo stesso modo?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline gfx

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy
  • Sistema operativo:
    ubuntu 14.04
Re: lista connessioni ative con ssdi e rssid
« Risposta #14 il: 24 Novembre 2016, 13:40:57 CET »
0
Codice (Java): [Seleziona]
public class FullscreenActivity extends AppCompatActivity {
    /**
     * Whether or not the system UI should be auto-hidden after
     * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
     */

    private static final boolean AUTO_HIDE = true;

    /**
     * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
     * user interaction before hiding the system UI.
     */

    private static final int AUTO_HIDE_DELAY_MILLIS = 3000;

    /**
     * Some older devices needs a small delay between UI widget updates
     * and a change of the status and navigation bar.
     */

    private static final int UI_ANIMATION_DELAY = 300;
    private final Handler mHideHandler = new Handler();
    private View mContentView;
    private final Runnable mHidePart2Runnable = new Runnable() {
        @SuppressLint("InlinedApi")
        @Override
        public void run() {
            // Delayed removal of status and navigation bar

            // Note that some of these constants are new as of API 16 (Jelly Bean)
            // and API 19 (KitKat). It is safe to use them, as they are inlined
            // at compile-time and do nothing on earlier devices.
            mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        }
    };
    private View mControlsView;
    private final Runnable mShowPart2Runnable = new Runnable() {
        @Override
        public void run() {
            // Delayed display of UI elements
            ActionBar actionBar = getSupportActionBar();
            getSupportActionBar().setDisplayShowHomeEnabled(true);
            getSupportActionBar().setLogo(R.drawable.bmecc24);
            getSupportActionBar().setDisplayUseLogoEnabled(true);
            /*getActionBar().setIcon(R.drawable.bmecc24);*/
            if (actionBar != null) {
                /*getActionBar().setIcon(R.drawable.bmecc24);*/
                actionBar.show();
            }
            mControlsView.setVisibility(View.VISIBLE);
        }
    };
    private boolean mVisible;
    private final Runnable mHideRunnable = new Runnable() {
        @Override
        public void run() {
            hide();
        }
    };
    /**
     * Touch listener to use for in-layout UI controls to delay hiding the
     * system UI. This is to prevent the jarring behavior of controls going away
     * while interacting with activity UI.
     */

    private final View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (AUTO_HIDE) {
                delayedHide(AUTO_HIDE_DELAY_MILLIS);
            }
            return false;
        }
    };
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */

    private GoogleApiClient client;

    private ProgressDialog mProgressDialog;
    private Context contxt;

    ToggleButton one;
    ToggleButton two;
    ToggleButton three;
    ToggleButton four;
    ToggleButton ak;
    ToggleButton bk;
    ToggleButton ck;
    ToggleButton manK;
    ToggleButton autoK;
    ToggleButton com1;
    ToggleButton com2;
    ToggleButton emek;
    ToggleButton onoffk;



    WifiManager wifi;
    List<ScanResult> wifiList;
    WifiReceiver wifiReceiver;
    ListView lstView;
    ArrayAdapter<String> adapter;
    ArrayList<String> wifiResults;




 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_fullscreen);

        mVisible = true;
        mControlsView = findViewById(R.id.fullscreen_content_controls);
        mContentView = findViewById(R.id.fullscreen_content);

        one = (ToggleButton) findViewById(R.id.start);
        two = (ToggleButton) findViewById(R.id.stop);
        three = (ToggleButton) findViewById(R.id.pause);
        four = (ToggleButton) findViewById(R.id.step);
        ak = (ToggleButton) findViewById(R.id.a);
        bk = (ToggleButton) findViewById(R.id.b);
        ck = (ToggleButton) findViewById(R.id.c);
        manK = (ToggleButton) findViewById(R.id.man);
        autoK = (ToggleButton) findViewById(R.id.auto);
        com1 = (ToggleButton) findViewById(R.id.mdi1);
        com2 = (ToggleButton) findViewById(R.id.mdi2);
        emek = (ToggleButton) findViewById(R.id.eme);
        onoffk = (ToggleButton) findViewById(R.id.on_off);


        one.setOnCheckedChangeListener(changeChecker);
        two.setOnCheckedChangeListener(changeChecker);
        three.setOnCheckedChangeListener(changeChecker);
        four.setOnCheckedChangeListener(changeChecker);
        ak.setOnCheckedChangeListener(changeChecker);
        bk.setOnCheckedChangeListener(changeChecker);
        ck.setOnCheckedChangeListener(changeChecker);
        manK.setOnCheckedChangeListener(changeChecker);
        autoK.setOnCheckedChangeListener(changeChecker);
        com1.setOnCheckedChangeListener(changeChecker);
        com2.setOnCheckedChangeListener(changeChecker);
        emek.setOnCheckedChangeListener(changeChecker);
        onoffk.setOnCheckedChangeListener(changeChecker);



        // Set up the user interaction to manually show or hide the system UI.
        mContentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggle();
            }
        });

        // Upon interacting with UI controls, delay any scheduled hide()
        // operations to prevent the jarring behavior of controls going away
        // while interacting with the UI.
        findViewById(R.id.fullscreen_content).setOnTouchListener(mDelayHideTouchListener);
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
        onResume();


        wifi = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);

        wifiResults=new ArrayList<String>();  
        final ListView lstView = (ListView) findViewById(R.id.WiFiList);
        final ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, R.layout.wifidiag_layout,R.id.wifi_name, wifiResults);
        /stView.setAdapter(adapter);


    }

questo è il mio on create  e tutto quello che c'è prima compresa la main activity class.... (ho commentato e decommentato con // più volte i vari comandi in modo da capirne il funzionamento ... ) ... più sotto intercetto i segnali dei vari pulsanti, creo un menù da cui prendo i segnali per creare la mia listview....

però credo che il problema solitamente venga risolto in un altro modo (scusa ma sono su java solo da 2 settimane a 2 ore ogni tanto) ...

dalla main activity si crea un menù a tendina (nel mio caso menù di impostazioni) e poi in base alle scelte si passa ad una nuova activity .... effettuate le scelte del caso si chiude l'activity corrente e si passa alla vecchia .... è corretta come procedura ??
In caso affermativo dovrei creare una nuova activity con dentro la list view ... da attivare secondo la scelta effettuata sul menù....
Credo che tutta la confuzione nasca dal fatto che cerco di fare tutto sulla main activity e ogni volta android cerca di usare la listview che a tutti gli effetti sul "context main activity" non esiste ... nel mio caso la main activity si chiama FullscreenActivity e ha id fulscreen_content ...

credo

Post unito: 24 Novembre 2016, 15:02:13 CET
nell'intento di utilizzare la strada della seconda activity ... ho creato questo come test) ...

nella mia main activity ho per l'appunto:

Codice (Java): [Seleziona]
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_fullscreen);

        mVisible = true;
        mControlsView = findViewById(R.id.fullscreen_content_controls);
        mContentView = findViewById(R.id.fullscreen_content);

        one = (ToggleButton) findViewById(R.id.start);
        two = (ToggleButton) findViewById(R.id.stop);
        three = (ToggleButton) findViewById(R.id.pause);
        four = (ToggleButton) findViewById(R.id.step);
        ak = (ToggleButton) findViewById(R.id.a);
        bk = (ToggleButton) findViewById(R.id.b);
        ck = (ToggleButton) findViewById(R.id.c);
        manK = (ToggleButton) findViewById(R.id.man);
        autoK = (ToggleButton) findViewById(R.id.auto);
        com1 = (ToggleButton) findViewById(R.id.mdi1);
        com2 = (ToggleButton) findViewById(R.id.mdi2);
        emek = (ToggleButton) findViewById(R.id.eme);
        onoffk = (ToggleButton) findViewById(R.id.on_off);


        one.setOnCheckedChangeListener(changeChecker);
        two.setOnCheckedChangeListener(changeChecker);
        three.setOnCheckedChangeListener(changeChecker);
        four.setOnCheckedChangeListener(changeChecker);
        ak.setOnCheckedChangeListener(changeChecker);
        bk.setOnCheckedChangeListener(changeChecker);
        ck.setOnCheckedChangeListener(changeChecker);
        manK.setOnCheckedChangeListener(changeChecker);
        autoK.setOnCheckedChangeListener(changeChecker);
        com1.setOnCheckedChangeListener(changeChecker);
        com2.setOnCheckedChangeListener(changeChecker);
        emek.setOnCheckedChangeListener(changeChecker);
        onoffk.setOnCheckedChangeListener(changeChecker);



        // Set up the user interaction to manually show or hide the system UI.
        mContentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggle();
            }
        });

        // Upon interacting with UI controls, delay any scheduled hide()
        // operations to prevent the jarring behavior of controls going away
        // while interacting with the UI.
        findViewById(R.id.fullscreen_content).setOnTouchListener(mDelayHideTouchListener);
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();

poi ho creato una seconda classe che richiamo così:

Codice (Java): [Seleziona]
  @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId(); /*sono nel menu e vedo le voci -- layout menu*/


        if(id == R.id.cerca_connessione){ /*clicco su questa voce*/

            Intent intent = new Intent(getApplicationContext(),ConnessioniDisponibili.class);


            if(isWifiConnected()){

                    startActivity(intent);


e questa è la mia nuova secondary activity class...


Codice (Java): [Seleziona]
package com.example.office.androidkc1;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Created by office on 24/11/16.
 */


public class ConnessioniDisponibili extends FullscreenActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.choose_activity1);


        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(
                        getApplicationContext(),
                        FullscreenActivity.class
                );
                startActivity(intent);
            }
        });
    }




}

ottengo però questo errore credo che i due metodi si sovrappongano ma non so il percè..

Codice: [Seleziona]
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.office.androidkc1, PID: 32459
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.office.androidkc1/com.example.office.androidkc1.ConnessioniDisponibili}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ToggleButton.setOnCheckedChangeListener(android.widget.CompoundButton$OnCheckedChangeListener)' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                      at android.app.ActivityThread.access$1100(ActivityThread.java:221)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7224)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ToggleButton.setOnCheckedChangeListener(android.widget.CompoundButton$OnCheckedChangeListener)' on a null object reference
                      at com.example.office.androidkc1.FullscreenActivity.onCreate(FullscreenActivity.java:248)
                      at com.example.office.androidkc1.ConnessioniDisponibili.onCreate(ConnessioniDisponibili.java:16)
                      at android.app.Activity.performCreate(Activity.java:6876)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                      at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:158) 
                      at android.app.ActivityThread.main(ActivityThread.java:7224) 

grazie se vorrai darmi indicazioni .... se questo và porterò tutto il broadcast receiver in questa seconda activity in modo da fare meno confuzsione ...

Grazie
Giorgio
« Ultima modifica: 24 Novembre 2016, 15:02:13 CET da gfx, Reason: Merged DoublePost »