5
Google은 사용자 위치를 기반으로 캠페인의 일부 알림을 푸시하려고하는 위치 기반 애플리케이션을 보유하고 있습니다. 그러나 이것은 휴대 전화의 배터리를 소모하는 것으로 보이며 때로는 요금의 30-35 %를 소비합니다.Android 위치 서비스 배터리 방전 위치 API
다음은 앱에서 위치 정보를 구현 한 것입니다.
public class DashboardActivity extends BaseActivity implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks,
LocationListener, ExitConfirmationDialog.OnExitResponseListner {
private final int HAS_PERMISSION_COARSE_LOCATION = 1;
private final int HAS_PERMISSION_FINE_LOCATION = 2;
LocationManager locationManager;
CustomTextViewDemi mNotificationCount;
String count = "";
Menu menu;
List<CreateFragmentsPojo> fragments;
boolean isSettingsScreenOpen = false;
int backPresedCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);
setTitle("Dashboard");
setupNavigationView(0);
fragments = new ArrayList<>();
Utils.HandleViews(mLayout, false);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (isGPSLocationEnabled(locationManager)) {
buildGooleApiClient();
} else if (isNetworkLocationEnabled(locationManager)) {
buildGooleApiClient();
} else {
showAlert();
}
}
private void buildGooleApiClient() {
buildGoogleApiClient();
if (Build.VERSION.SDK_INT >= 23) {
requestPermission();
} else {
if (mGoogleApiClient != null) {
if (mGoogleApiClient.isConnected()) {
getUserCurrentLocation();
} else {
mGoogleApiClient.connect();
}
} else {
getDashBoard("", "");
}
}
}
public void getData(String lat, String lng) {
if (Utils.isInternetConnection(this)) {
getCampaignDetails(lat, lng);
} else {
Utils.HandleViews(progressBar, false);
Utils.showMessages(this, Params.CHECK_INTERNET_MESSAGE, true);
}
}
private void getUserCurrentLocation() {
try {
Utils.HandleViews(progressBar, true);
if (mGoogleApiClientAwareness == null) {
buildGoogleApiAwarenessClient();
}
Awareness.SnapshotApi.getLocation(mGoogleApiClientAwareness)
.setResultCallback(new ResultCallback<LocationResult>() {
@Override
public void onResult(@NonNull LocationResult locationResult) {
if (!locationResult.getStatus().isSuccess()) {
Log.e("awareness demo api ", "Could not get location.");
if (mGoogleApiClient != null) {
try {
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
getDashBoard(mLastLocation.getLatitude() + "", mLastLocation.getLongitude() + "");
} else {
getDashBoard("", "");
}
} catch (SecurityException e) {
e.printStackTrace();
}
} else {
if (locationManager != null) {
String provider = Utils.getUserLastLocation(locationManager);
if (provider != null) {
try {
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
getDashBoard(location.getLatitude() + "", location.getLongitude() + "");
} else {
getDashBoard("", "");
}
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
}
}
try {
Location location = locationResult.getLocation();
if (location != null) {
getDashBoard(location.getLatitude() + "", location.getLongitude() + "");
} else {
getDashBoard("", "");
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (SecurityException se) {
se.printStackTrace();
}
}
private void showAlert() {
final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("Enable Location")
.setMessage("Your Locations Settings is set to 'Off'.\nPlease Enable Location to " +
"get campaigns at your location.")
.setPositiveButton("Location Settings", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
isSettingsScreenOpen = true;
Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(myIntent, 201);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
getUserCurrentLocation();
}
});
dialog.show();
}
/**
* Get user permissions for location based updates
*/
@TargetApi(23)
private void requestPermission() {
int HAS_REQUEST_PERMISSION_COARSE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
if (HAS_REQUEST_PERMISSION_COARSE_LOCATION
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
new AlertDialog.Builder(this)
.setTitle("Request Permission")
.setMessage("Provide permission to access your location")
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
HAS_PERMISSION_COARSE_LOCATION);
}
}).create().show();
} else {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
HAS_PERMISSION_COARSE_LOCATION);
}
} else {
requestFineLocationPermission();
}
}
@TargetApi(23)
private void requestFineLocationPermission() {
int HAS_REQUEST_PERMISSION_FINE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if (HAS_REQUEST_PERMISSION_FINE_LOCATION
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
new AlertDialog.Builder(this)
.setTitle("Request Permission")
.setMessage("Provide permission to access your location")
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
HAS_PERMISSION_FINE_LOCATION);
}
}).create().show();
} else {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
HAS_PERMISSION_FINE_LOCATION);
}
} else {
getUserCurrentLocation();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == HAS_PERMISSION_COARSE_LOCATION) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestFineLocationPermission();
}
} else if (requestCode == HAS_PERMISSION_FINE_LOCATION) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getUserCurrentLocation();
}
}
}
/**
* Call to detect new campaigns near by
*/
private void getUserLocationBackgroundProcess() {
try {
//Utils.getCurrentLocation(this);
startLocationUpdates();
} catch (Exception e) {
e.printStackTrace();
}
}
private boolean isGPSLocationEnabled(LocationManager locationManager) {
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
private boolean isNetworkLocationEnabled(LocationManager locationManager) {
return locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
protected synchronized void buildGoogleApiAwarenessClient() {
try {
Log.i(TAG, "activity Building GoogleApiClient===");
mGoogleApiClientAwareness = new GoogleApiClient.Builder(this)
.addApi(Awareness.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClientAwareness.connect();
//createLocationRequest();
} catch (Exception e) {
e.printStackTrace();
}
}
protected synchronized void buildGoogleApiClient() {
try {
Log.i(TAG, "activity Building GoogleApiClient===");
buildGoogleApiAwarenessClient();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
createLocationRequest();
} catch (Exception e) {
e.printStackTrace();
getUserCurrentLocation();
}
}
protected void createLocationRequest() {
mGoogleApiClient.connect();
mLocationRequest = new LocationRequest();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(30);
}
@Override
public void onLocationChanged(Location location) {
mCurrentLocation = location;
}
@Override
public void onConnected(@Nullable Bundle bundle) {
getUserCurrentLocation();
// startLocationUpdates();
}
protected void startLocationUpdates() {
try {
mRequestingLocationUpdates = true;
Intent receiverIntentService = new Intent(this, LocationIntentService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 1, receiverIntentService, 0);
if (mGoogleApiClient != null) {
if (mGoogleApiClient.isConnected()) {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, pendingIntent);
}
/*else {
mGoogleApiClient.connect();
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, pendingIntent);
}*/
} else {
buildGoogleApiClient();
}
} catch (SecurityException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
try {
if (isSettingsScreenOpen) {
isSettingsScreenOpen = false;
getUserCurrentLocation();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
protected void onStop() {
super.onStop();
if (mGoogleApiClient != null) {
if (mGoogleApiClient.isConnected())
mGoogleApiClient.disconnect();
}
}
}
1. 'BaseActivity'에 무엇이 있습니까? 2. Google 샘플에 사용 된 'LocationManager'가 없습니다 - https://github.com/googlesamples/android-play-location/blob/master/LocationUpdates/ app/src/main/java/com/google/android/gms/location/sample/locationupdates/MainActivity.java 구글 퓨즈 위치 API가 아닌 장치 LocationManager를 호출하는지 궁금합니다. –
@MorrisonChang BaseActivity ->는 앱의 다른 활동과 공통 매개 변수를 보유하는 부모 활동입니다. 어디에서 여러 번 같은 코드를 쓸 필요가 없으며 활동에서 호출 할 수 있습니다. GPS를 사용할 수없는 경우 LocationManager가 사용됩니다. –