0

프래그먼트에서 서비스의 지속적인 위치 업데이트를해야하는 앱을 만들고 있습니다. 문제는 프래그먼트가 업데이트를받지 못하고 무엇이 문제인지 잘 모르는 것입니다. 내가 만들고 그것을프래그먼트 브로드 캐스트 수신기가 작동하지 않습니다.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    receiver= new GPSReceiver(); 
    //this.getActivity().registerReceiver(receiver, new IntentFilter()); 

    db=Database.getInstance(this.getContext()); 


} 
@Override 
public void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter("GPSLocationUpdates"); 
    getActivity().registerReceiver(receiver,filter); 
} 

@Override 
public void onPause() { 
    getActivity().unregisterReceiver(receiver); 
    super.onPause(); 
} 
등록 방법

public class GPService extends Service 
{ 
private LocationManager locMan; 
private Boolean locationChanged; 
private Handler handler = new Handler(); 
static final int REQUEST_LOCATION = 1; 

public static Location curLocation; 
public static boolean isService = true; 
public LocalBroadcastManager broadcast; 


LocationListener gpsListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     if (curLocation == null) { 
      curLocation = location; 
      locationChanged = true; 
      Intent intent= new Intent("GPSLocationUpdates"); 
      intent.putExtra("latitud",curLocation.getLatitude()); 
      intent.putExtra("latitud",curLocation.getLongitude()); 
      LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); 

     }else if (curLocation.getLatitude() == location.getLatitude() && curLocation.getLongitude() == location.getLongitude()){ 
      locationChanged = false; 
      return; 
     }else 
      locationChanged = true; 

     curLocation = location; 

     if (locationChanged) 
      locMan.removeUpdates(gpsListener); 

    } 
    public void onProviderDisabled(String provider) { 
    } 

    public void onProviderEnabled(String provider) { 
    } 

    public void onStatusChanged(String provider, int status,Bundle extras) { 

    } 

}; 

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

    curLocation = getBestLocation(); 

    if (curLocation == null) 
     Toast.makeText(getBaseContext(),"Unable to get your location", Toast.LENGTH_SHORT).show(); 
    else{ 
     //Toast.makeText(getBaseContext(), curLocation.toString(), Toast.LENGTH_LONG).show(); 
    } 

    isService = true; 
    broadcast= LocalBroadcastManager.getInstance(this); 

} 
final String TAG="LocationService"; 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return super.onStartCommand(intent, flags, startId); 
} 
@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
} 

@Override 
public void onStart(Intent i, int startId){ 
    handler.postDelayed(GpsFinder,1); 
} 

@Override 
public void onDestroy() { 
    handler.removeCallbacks(GpsFinder); 
    handler = null; 
    Toast.makeText(this, "Stop services", Toast.LENGTH_SHORT).show(); 
    isService = false; 
} 

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

public Runnable GpsFinder = new Runnable(){ 
    public void run(){ 

     Location tempLoc = getBestLocation(); 
     if(tempLoc!=null) 
      curLocation = tempLoc; 
     tempLoc = null; 
     handler.postDelayed(GpsFinder,1000); 
    } 
}; 

private Location getBestLocation() { 
    Location gpslocation = null; 
    Location networkLocation = null; 

    if(locMan==null){ 
     locMan = (LocationManager) getApplicationContext() .getSystemService(Context.LOCATION_SERVICE); 
    } 
    try { 
     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED && 
       ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) 
         != PackageManager.PERMISSION_GRANTED) { 

      //ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION); 
     } 
     else { 
      if(locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)){ 


       locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 1, gpsListener); 
       gpslocation = locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
       Intent intent= new Intent("GPSLocationUpdates"); 
       intent.putExtra("latitud",gpslocation.getLatitude()); 
       intent.putExtra("longitud",gpslocation.getLongitude()); 
       Log.wtf("COORDENATES TO SEND",gpslocation.getLatitude()+" "+gpslocation.getLongitude()); 
       LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); 

      } 
      if(locMan.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){ 
       locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000, 1, gpsListener); 
       networkLocation = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
       Intent intent= new Intent("GPSLocationUpdates"); 
       Log.wtf("LAS COORDENADAS a enviar SON",networkLocation.getLatitude()+" "+networkLocation.getLongitude()); 

       intent.putExtra("latitud",networkLocation.getLatitude()); 
       intent.putExtra("longitud",networkLocation.getLongitude()); 
       LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); 
      } 
     } 

서비스는이 조각이

startService(new Intent(this, GPService.class)); 

같은 활동 시작은 다음과 같습니다, 여기에 서비스

마지막으로 이것은 조각의 수신자입니다. 서비스에서 정보를 얻지 못합니다. 어떤 아이디어입니까? 내가 뭘 잘못하고 있는지 모르겠다.

private class GPSReceiver extends BroadcastReceiver { 


    private LatLng changed; 

    public GPSReceiver() 
    { 
     changed= new LatLng(0,0); 
    } 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.wtf("RECIEVE", "IT IS IN BROADCAST"); 
     if (intent.getAction().equals("GPSLocationUpdates")) 
     { 
      Log.wtf("RECIEVE1", "INTENT ARRIVES"); 
      double lat= intent.getDoubleExtra("latitud",1); 
      double longi= intent.getDoubleExtra("longitud",1); 
      changed= new LatLng(lat,longi); 

     } 
     // String text = intent.getStringExtra("position"); 

    } 
    public LatLng getChanged() 
    { 
     return changed; 
    } 
} 

서비스가 정상적으로 작동하는 것처럼 보입니다. 콘솔에서 좌표가 전송되는 것을 볼 수 있습니다.

답변

1

BroadcastReceiver를 LocalBroadcastManager에 등록하지 않았습니다. 글로벌 방송 관리자에게 등록하고 있지만 로컬에 보냅니다.

변경 :

@Override 
public void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter("GPSLocationUpdates"); 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver,filter); 
} 

@Override 
public void onPause() { 
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(receiver); 
    super.onPause(); 
} 
+0

감사합니다, 그것은 단지 그 것이었다! – user3487815

관련 문제