2016-12-19 12 views
5

हमारे पास एक स्थान आधारित एप्लिकेशन है, जहां उपयोगकर्ता के स्थान पर आधारित हम अभियान की कुछ अधिसूचनाओं को धक्का देने की कोशिश कर रहे हैं। लेकिन ऐसा लगता है कि फोन की बैटरी निकाली जा रही है और कभी-कभी चार्ज के 30-35% तक का उपभोग होता है।बैटरी स्थानांतरित करने वाली एंड्रॉइड लोकेशन सर्विसेज - फ्यूज्ड लोकेशन एपीआई

नीचे हमारे ऐप में स्थान का कार्यान्वयन है।

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. आपकी 'बेस एक्टिविटी' में क्या है 2. मुझे Google नमूना में उपयोग किया गया 'स्थान प्रबंधक' नहीं दिखाई देता है - https://github.com/googlesamples/android-play-location/blob/master/LocationUpdates/ ऐप/src/main/java/com/google/android/gms/location/sample/locationupdates/MainActivity.java मुझे आश्चर्य है कि क्या यह Google के फ़्यूज्ड लोकेशन एपीआई के बजाए डिवाइस स्थान प्रबंधक का आविष्कार कर रहा है 3. आप स्थान अपडेट कहां बंद कर रहे हैं? –

+0

@ मॉरिसनचांग बेसएक्टिविटी -> मूल गतिविधि है जो ऐप की अन्य गतिविधियों के साथ आम पैरा रखती है। जहां मुझे कई बार एक ही कोड लिखने की आवश्यकता नहीं है और मैं उन्हें केवल गतिविधि से कॉल कर सकता हूं। स्थान प्रबंधक का उपयोग तब किया जाता है जब जीपीएस उपलब्ध न हो। –

उत्तर

10
के बजाय

mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

इस

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

mlocationrequest.setSmallestDisplacement(30); //higher priority 

विस्थापन पैरामीटर कोशिश 30 मीटर // कोई स्थान अद्यतन डिवाइस के लिए कदम नहीं करता है तो या उस दूरी को पार प्राप्त कर रहे हैं के लिए सेट है ।

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

mlocationrequest.setFastestInterval(10000); 

LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY स्तर सटीकता के बारे में 100 मीटर सटीकता माना जाता है। एक मोटे सटीकता का उपयोग करना जैसे कि अक्सर कम शक्ति का उपभोग करता है।

संबंधित मुद्दे