2016-05-11 7 views
0

Ich versuche, einen Ort zu bekommen, um die drei nächstgelegenen Restaurants in einem Fragment zu zeigen.Location Service funktioniert nicht in Fragment

Der Standort sollte vor dem Laden der Ansicht erhalten werden, da die Position der Restaurants von der Position abhängt.

///////////////// Fragment ///////////////////

private double latitude; 
    private double longitude; 
    private LocationReceiver locationReceiver; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     final View myFragmentView = inflater.inflate(R.layout.fragment_resturants, container, false); 

     DataSource dataSource = new DataSource(getContext()); 
     final List<Restaurant> lista = dataSource.getThreeNearRestaurants(latitude, longitude); 

     TextView nombre1 = (TextView) myFragmentView.findViewById(R.id.input_nombre1); 
     TextView direccion1 = (TextView) myFragmentView.findViewById(R.id.input_direccion1); 
     TextView ciudad1 = (TextView) myFragmentView.findViewById(R.id.input_ciudad1); 
     TextView pais1 = (TextView) myFragmentView.findViewById(R.id.input_pais1); 
     nombre1.setText(lista.get(0).getName()); 
     direccion1.setText(lista.get(0).getAddress()); 
     ciudad1.setText(lista.get(0).getCity()); 
     switch(lista.get(0).getCountry()){ 
      case "France": 
       pais1.setText(R.string.france); 
       break; 
      case "Spain": 
       pais1.setText(R.string.spain); 
       break; 
      case "Poland": 
       pais1.setText(R.string.poland); 
       break; 
      case "Portugal": 
       pais1.setText(R.string.portugal); 
     } 

     TextView nombre2 = (TextView) myFragmentView.findViewById(R.id.input_nombre2); 
     TextView direccion2 = (TextView) myFragmentView.findViewById(R.id.input_direccion2); 
     TextView ciudad2 = (TextView) myFragmentView.findViewById(R.id.input_ciudad2); 
     TextView pais2 = (TextView) myFragmentView.findViewById(R.id.input_pais2); 
     nombre2.setText(lista.get(1).getName()); 
     direccion2.setText(lista.get(1).getAddress()); 
     ciudad2.setText(lista.get(1).getCity()); 
     switch(lista.get(1).getCountry()){ 
      case "France": 
       pais2.setText(R.string.france); 
       break; 
      case "Spain": 
       pais2.setText(R.string.spain); 
       break; 
      case "Poland": 
       pais2.setText(R.string.poland); 
       break; 
      case "Portugal": 
       pais2.setText(R.string.portugal); 
     } 

     TextView nombre3 = (TextView) myFragmentView.findViewById(R.id.input_nombre3); 
     TextView direccion3 = (TextView) myFragmentView.findViewById(R.id.input_direccion3); 
     TextView ciudad3 = (TextView) myFragmentView.findViewById(R.id.input_ciudad3); 
     TextView pais3 = (TextView) myFragmentView.findViewById(R.id.input_pais3); 
     nombre3.setText(lista.get(2).getName()); 
     direccion3.setText(lista.get(2).getAddress()); 
     ciudad3.setText(lista.get(2).getCity()); 
     switch(lista.get(2).getCountry()) { 
      case "France": 
       pais3.setText(R.string.france); 
       break; 
      case "Spain": 
       pais3.setText(R.string.spain); 
       break; 
      case "Poland": 
       pais3.setText(R.string.poland); 
       break; 
      case "Portugal": 
       pais3.setText(R.string.portugal); 
     } 

     CardView cardView1 = (CardView) myFragmentView.findViewById(R.id.card_view1); 

     cardView1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       localizar(lista.get(0)); 
      } 
     }); 

     CardView cardView2 = (CardView) myFragmentView.findViewById(R.id.card_view2); 

     cardView2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       localizar(lista.get(1)); 
      } 
     }); 

     CardView cardView3 = (CardView) myFragmentView.findViewById(R.id.card_view3); 

     cardView3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       localizar(lista.get(2)); 
      } 
     }); 

     return myFragmentView; 
    } 

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

     locationReceiver = new LocationReceiver(); 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(LocationService.MY_ACTION); 
     getActivity().registerReceiver(locationReceiver, intentFilter); 

     Intent intent = new Intent(getContext(), LocationService.class); 
     getActivity().startService(intent); 


    } 

    private void localizar(Restaurant restaurant) { 
     Uri gmmIntentUri = Uri.parse("google.navigation:q=" + restaurant.getLatitude() + "," + restaurant.getLongitude()); 
     Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); 
     mapIntent.setPackage("com.google.android.apps.maps"); 
     startActivity(mapIntent); 
    } 

    private class LocationReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context arg0, Intent intent) { 
      Bundle b = intent.getExtras(); 
      latitude = b.getDouble("latitude"); 
      longitude = b.getDouble("longitude"); 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     getActivity().unregisterReceiver(locationReceiver); 
    } 

// /////////////// LocationService ///////////////////

public class LocationService extends Service { 
    final static String MY_ACTION = "MY_ACTION"; 
    private LocationManager mLocationManager = null; 
    private static final int LOCATION_INTERVAL = 1000; 
    private static final float LOCATION_DISTANCE = 10f; 
    private Location mLastLocation; 

    private class LocationListener implements android.location.LocationListener { 

     public LocationListener(String provider) { 
      Log.e(TAG, "LocationListener " + provider); 
      mLastLocation = new Location(provider); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
      Log.e(TAG, "onLocationChanged: " + location); 

      mLastLocation.set(location); 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      Log.e(TAG, "onProviderDisabled: " + provider); 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      Log.e(TAG, "onProviderEnabled: " + provider); 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      Log.e(TAG, "onStatusChanged: " + provider); 
     } 
    } 

    LocationListener[] mLocationListeners = new LocationListener[]{ 
      new LocationListener(LocationManager.GPS_PROVIDER), 
      new LocationListener(LocationManager.NETWORK_PROVIDER) 
    }; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.e(TAG, "onStartCommand"); 
     MyThread myThread = new MyThread(); 
     myThread.start(); 
     return super.onStartCommand(intent, flags, startId); 
//  return START_STICKY; 
    } 

    public class MyThread extends Thread { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      for (int i = 0; i < 10; i++) { 
       try { 
        Thread.sleep(5000); 
        Intent intent = new Intent(); 
        intent.setAction(MY_ACTION); 

        intent.putExtra("latitude", mLastLocation.getLatitude()); 
        intent.putExtra("longitude", mLastLocation.getLongitude()); 

        sendBroadcast(intent); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      stopSelf(); 
     } 

    } 

    @Override 
    public void onCreate() { 
     Log.e(TAG, "onCreate"); 
     initializeLocationManager(); 
     try { 
      mLocationManager.requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 
        mLocationListeners[1]); 
     } catch (SecurityException ex) { 
      Log.i(TAG, "fail to request location update, ignore", ex); 
     } catch (IllegalArgumentException ex) { 
      Log.d(TAG, "network provider does not exist, " + ex.getMessage()); 
     } 
     try { 
      mLocationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 
        mLocationListeners[0]); 
     } catch (SecurityException ex) { 
      Log.i(TAG, "fail to request location update, ignore", ex); 
     } catch (IllegalArgumentException ex) { 
      Log.d(TAG, "gps provider does not exist " + ex.getMessage()); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     Log.e(TAG, "onDestroy"); 
     super.onDestroy(); 
     if (mLocationManager != null) { 
      for (LocationListener mLocationListener : mLocationListeners) { 
       try { 
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
         // TODO: Consider calling 
         // ActivityCompat#requestPermissions 
         // here to request the missing permissions, and then overriding 
         // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
         //           int[] grantResults) 
         // to handle the case where the user grants the permission. See the documentation 
         // for ActivityCompat#requestPermissions for more details. 
         return; 
        } 
        mLocationManager.removeUpdates(mLocationListener); 
       } catch (Exception ex) { 
        Log.i(TAG, "fail to remove location listners, ignore", ex); 
       } 
      } 
     } 
    } 

    private void initializeLocationManager() { 
     Log.e(TAG, "initializeLocationManager"); 
     if (mLocationManager == null) { 
      mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
     } 
    } 

die empfangene Lage ist 0.0, da die Ansicht laden, bevor Sie den Standort bekommen. Wie kann ich es lösen?

Vielen Dank im Voraus

+0

Hast du die Berechtigung in der Datei AndroidManifest.xml hinzugefügt? – Dhruv

+0

Haben Sie Protokolle? Es könnte einfacher sein, das Problem aufzuspüren. Mein anderer Gedanke wäre, erwarten Sie nicht, dass die Daten vom Dienst bereit sind, bevor Sie die Ansichten aufblasen. Bitte verwenden Sie eine Art Rückrufe, wenn der Dienst die Werte hat, könnte es die Korrespondenzansichten aktualisieren. –

+0

@Dhruv ja ich habe es hinzugefügt – eligonz

Antwort

0

Sie die Sendungen verwenden, dies würde auch funktionieren. Sie müssen nur die LocationReceiver.onReceive-Methode aktualisieren, um die Ansichten dort zu aktualisieren. im Grunde sagen Sie: "Hey LocationService, hol meine Restaurants. Der LocationService sendet es dir und sagt: Hey, das sind die Restaurants." Und du speicherst nur die Koordinaten, aber nicht die Ansichten. Sie müssen berücksichtigen, dass dieser Prozess Zeit braucht und Ihre Ansichten bereits gezeichnet sind. Aktualisieren Sie einfach alle Ansichten nach dem Empfang der Übertragung. Es wird es tun. Entschuldigung, habe deinen Code jetzt nur verstanden;)

Verwandte Themen