2016-12-19 3 views
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(); 
     } 
    } 


} 
+0

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를 호출하는지 궁금합니다. –

+0

@MorrisonChang BaseActivity ->는 앱의 다른 활동과 공통 매개 변수를 보유하는 부모 활동입니다. 어디에서 여러 번 같은 코드를 쓸 필요가 없으며 활동에서 호출 할 수 있습니다. GPS를 사용할 수없는 경우 LocationManager가 사용됩니다. –

답변

10

대신

mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

mlocationrequest.setSmallestDisplacement(30); //higher priority 

변위 매개 변수를 시도는 장치가 이동하거나 거리를 교차하지 않는 경우 어떤 위치 업데이트가 수신되지 // 30m 로 설정 .

//setInterval as above 1 mins. 
mlocationrequest.setInterval(60000); // Update location every 1 minute 

mlocationrequest.setFastestInterval(10000); 

LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY 수준의 정확도는 약 100 미터의 정확도로 간주된다. 이와 같이 거친 정확도를 사용하면 전력 소모가 적습니다.