2015-06-17 2 views
0

Я работаю над приложением, которое загружает карту (как изображение). Я использую настроенное представление для загрузки изображения. Я должен выполнить wifi-сканирование и сохранять результаты, когда пользователь прикасается к карте.wifi scan не выполняется при вызове wifi.startScan() вне MainActivity

Я объявил менеджеру WiFi этот путь:

public static WifiManager wifi; 

так, что я могу использовать его в моей настраиваемое представление. Когда я вызываю wifi.startScan(); из настраиваемого представления, он не выполняет проверку. Он работает без ошибок или исключений, но результат сканирования не доступен.

Это код моего радиовещательного приемника:

public class WifiReceiver extends BroadcastReceiver { 


     /* 
     * This receiver will set a flag in the main activity to indicate the new scan result has been set 
     * it will set the new result too. 
     * 
     */ 
     public void onReceive(Context c, Intent intent) { 

      result=wifi.getScanResults(); 

      Log.d("surveyTool","scanning result set"); 


     } 
     } 

Насколько понимаю, как сканирование работы, когда wifi.startScan() называется, код внутри onReceiver() должен быть выполнен, когда результат сканирования доступен. Но этого не происходит.

Может ли кто-нибудь сказать мне, что здесь не так? или что мне делать, чтобы начать сканирование с моего индивидуального представления?

Примечание: Я добавил необходимые разрешения и сканирование работает, если я называю это внутри MainActivity ** EDIT: **

Я зарегистрировал приемник в MainActivity с помощью этого:

receiverWifi = new WifiReceiver(); 
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 

Я звоню wifi.startScan() в onTouch() функции в моей настраиваемое представление:

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    // the coordinate of the touch point 
    x=event.getX(); 
    y=event.getY(); 

    try { 
     touchManager.update(event); 

     // single point touch 
     if (touchManager.getPressCount() == 1) { 


      position.add(touchManager.moveDelta(0)); // to keep the point drawn at the touch location 
      info.addToStartPoint(touchManager.moveDelta(0)); 

      if((touchManager.moveDelta(0).getX()==0 && touchManager.moveDelta(0).getY()== 0)) 
      { 


       PreviousPoint= CurrentPoint; 
       CurrentPoint=info.Map(x, y); 


       if(CurrentPoint.getX()!=PreviousPoint.getX() && CurrentPoint.getY()!= PreviousPoint.getY()) 
       { 
        // the point is on the image 
        if(CurrentPoint.getX()!=-1 && CurrentPoint.getY()!= -1) 
        { 
         MainActivity.wifi.startScan(); 
         MainActivity.counter++; 
         Log.d("surveyTool","touch: "+MainActivity.counter); 
         MainActivity.location=CurrentPoint; 
         MainActivity.newLocationAvailable=true; 
         MainActivity.AddNewFingerprin(); 
        } 

       // Log.d("surveyTool", " new touch event occurred"); 
        // here do the surveying and other stuff  
       } 

      } 
     } 
     else { 
      if (touchManager.getPressCount() == 2) { 

       Vector2D current = touchManager.getVector(0, 1); 
       Vector2D previous = touchManager.getPreviousVector(0, 1); 
       float currentDistance = current.getLength(); 
       float previousDistance = previous.getLength(); 

       if (previousDistance != 0) { 
        scale *= currentDistance/previousDistance; // for the zoom 
        info.setZoomFactor(scale); 

       }// end of != 0 
      }// end of if ==2 
     }// end of else 

     invalidate(); // will cause a redraw 
    } 
    catch(Throwable t) { 

    } 
    return true; 
} 

EDIT

Отменить регистрацию приемника в onPause(), и я зарегистрирую его снова в onResume().

ответ

1

Поскольку вы разрегистрировать свой вещательный приемник OnPause() активности после того, как ваша деятельность будет уничтожена вы не будете в состоянии получить систему вещания для результатов сканирования WiFi доступного, если вы звоните wifi.startScan()

Вам нужно будет определить широковещательный приемник и зарегистрировать его в xml, чтобы иметь возможность прослушивать результаты сканирования вне активности.

Сделать приемник для этого:

public class ScanResultsReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

    //You need to initialise the wifimanager like this 
    private WifiManager wifiManager; 
    wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    //Now get Scan Results 
    List<ScanResult> results = wifiManager.getScanResults();  
    } 
} 

В манифесте добавить

<receiver android:name=".wifiReceiver" android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.net.wifi.SCAN_RESULTS"></action> 
     </intent-filter> 
    </receiver> 
//Note: android:name may differ according to your package structure 

Теперь, когда вы звоните wifiManager.startScan() из любой деятельности или где-либо еще в приложении вы получите системную трансляцию

+0

Когда я сделал то, что предложил, я продолжал получать сообщение, когда мое приложение перестало работать, хотя я его не запускал. Можешь мне сказать почему? – Alaa

+0

Не знаете об этом Можете ли вы рассказать мне, что вы добавили в свой файл манифеста? –

1

Может быть, это происходит потому, что вы не регистрируете свой приемник, как это в исходном коде

WifiReceiver wifiReciever = new WifiReceiver(); 
registerReceiver(wifiReciever, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 

Это будет полезно в ответе, если вы предоставить более подробную информацию, так что, если это не работает, пожалуйста, предоставить некоторые больше информации

+0

Я зарегистрировал это. Я буду обновлять свой вопрос, чтобы отразить это. – Alaa

+0

Когда вы отмените регистрацию вещательного приемника. ??? Если вы отмените регистрацию в onstop() или ondestroy() действия WifiManager.SCAN_RESULTS_AVAILABLE_ACTION после этого не будут получены. В противном случае ваше возмущение в порядке –

+0

Я отменяю регистратор на onPause() и зарегистрирую его снова на onResume() @SahilBahl – Alaa

Смежные вопросы