我正在制作一个我们使用Api在服务器上发送用户位置的应用程序,基本上是以下情况:当用户有时会弹出位置提示后启动应用程序,以及当用户选择“是”后,在30秒后将使用另一个代码块执行该应用程序可运行方法。一切正常,唯一的问题是单击“是”后,定位服务无法启动,我必须手动将其打开,并且在打开后,我可以发送lat long.Need这个问题上需要一些建议,这是我到目前为止尝试过的。预先谢谢你!
LocationTrack.java
public class LocationTrack extends Service implements LocationListener {
private final Context mContext;
boolean checkGPS = false;
boolean checkNetwork = false;
boolean canGetLocation = false;
Location loc;
double latitude;
double longitude;
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;
protected LocationManager locationManager;
public LocationTrack(Context mContext) {
this.mContext = mContext;
getLocation();
}
private Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// get GPS status
// checkGPS = locationManager
// .isProviderEnabled(LocationManager.GPS_PROVIDER);
// get network provider status
checkNetwork = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!checkNetwork) {
Toast.makeText(mContext, "No Service Provider is available", Toast.LENGTH_SHORT).show();
} else {
this.canGetLocation = true;
if (checkNetwork) {
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(mContext, 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.
}
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null) {
loc = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
if (loc != null) {
latitude = loc.getLatitude();
longitude = loc.getLongitude();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return loc;
}
public double getLongitude() {
if (loc != null) {
longitude = loc.getLongitude();
}
return longitude;
}
public double getLatitude() {
if (loc != null) {
latitude = loc.getLatitude();
}
return latitude;
}
public boolean canGetLocation() {
return this.canGetLocation;
}
// public void showSettingsAlert() {
// AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
//
//
// alertDialog.setTitle("GPS is not Enabled!");
//
// alertDialog.setMessage("Do you want to turn on GPS?");
//
//
// alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int which) {
//
// }
// });
//
//
// alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int which) {
// dialog.cancel();
// }
// });
//
//
// alertDialog.show();
// }
public void stopListener() {
if (locationManager != null) {
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(mContext, 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;
}
locationManager.removeUpdates(LocationTrack.this);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
String url = "API";
String androidId, uuid;
String deviceDetails;
//location variables
double latitude, longitude, lng, lat;
private ArrayList<String> permissionsToRequest;
private ArrayList<String> permissionsRejected = new ArrayList<>();
private ArrayList<String> permissions = new ArrayList<>();
private final static int ALL_PERMISSIONS_RESULT = 101;
LocationTrack locationTrack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//location Permission
permissions.add(ACCESS_FINE_LOCATION);
permissions.add(ACCESS_COARSE_LOCATION);
permissionsToRequest = findUnAskedPermissions(permissions);
askLocation();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//device details
androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
uuid = UUID.randomUUID().toString();
getDeviceDetails();
StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("CODE", "================================");
Log.i("Response", response);
Log.i("CODE", "================================");
Toast.makeText(MainActivity.this, "Successful", Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("CODE", "================================");
Log.i("Error", String.valueOf(error));
Log.i("CODE", "================================");
Toast.makeText(MainActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
// if (locationTrack.canGetLocation()) {
//
//
// lng = locationTrack.getLongitude();
// lat = locationTrack.getLatitude();
//
// Toast.makeText(getApplicationContext(), "Longitude:" + Double.toString(longitude) + "\nLatitude:" + Double.toString(latitude), Toast.LENGTH_SHORT).show();
// }
Map<String, String> params = new HashMap<>();
params.put("lat", String.valueOf(lng));
params.put("lng", String.valueOf(lat));
params.put("android_id", androidId);
params.put("uuid", uuid);
params.put("device_details", deviceDetails);
return params;
}
};
RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
queue.add(request);
}
}, 30000);
}
@SuppressLint("HardwareIds")
public void getDeviceDetails() {
deviceDetails = "SERIAL : " + Build.SERIAL + " , " +
"MODEL: " + Build.MODEL + " , " +
"ID: " + Build.ID + " , " +
"Manufacture: " + Build.MANUFACTURER + " , " +
"Brand: " + Build.BRAND + " , " +
"SDK: " + Build.VERSION.SDK_INT + " , " +
"Version Code: " + Build.VERSION.RELEASE;
Toast.makeText(MainActivity.this, "Successful" + deviceDetails, Toast.LENGTH_LONG).show();
}
//location methods
private ArrayList<String> findUnAskedPermissions(ArrayList<String> wanted) {
ArrayList<String> result = new ArrayList<String>();
for (String perm : wanted) {
if (!hasPermission(perm)) {
result.add(perm);
}
}
return result;
}
private boolean hasPermission(String permission) {
if (canMakeSmores()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED);
}
}
return true;
}
private boolean canMakeSmores() {
return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == ALL_PERMISSIONS_RESULT) {
for (String perms : permissionsToRequest) {
if (!hasPermission(perms)) {
permissionsRejected.add(perms);
}
}
if (permissionsRejected.size() > 0) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (shouldShowRequestPermissionRationale(permissionsRejected.get(0))) {
showMessageOKCancel("These permissions are mandatory for the application. Please allow access.",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissionsRejected.toArray(new String[0]), ALL_PERMISSIONS_RESULT);
}
}
});
}
}
}
}
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
private void askLocation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (permissionsToRequest.size() > 0)
requestPermissions(permissionsToRequest.toArray(new String[0]), ALL_PERMISSIONS_RESULT);
}
locationTrack = new LocationTrack(MainActivity.this);
if (locationTrack.canGetLocation()) {
longitude = locationTrack.getLongitude();
latitude = locationTrack.getLatitude();
Toast.makeText(getApplicationContext(), "Longitude:" + (longitude) + "\nLatitude:" + (latitude), Toast.LENGTH_SHORT).show();
} else {
// locationTrack.showSettingsAlert();
longitude = locationTrack.getLongitude();
latitude = locationTrack.getLatitude();
}
lat = latitude;
lng = longitude;
}
@Override
protected void onDestroy() {
super.onDestroy();
locationTrack.stopListener();
}
}
答案 0 :(得分:0)
我认为这已经得到回答:
https://stackoverflow.com/a/46385161/1337664
Google会不断更改这些东西的API,因此您需要多种方式,具体取决于您要支持多少个较旧的Android版本。