- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好 Stackoverflow 社区,我是 android 的新手,正在学习如何实现基于位置的服务。
我成功地实现了一个速度计应用程序,它可以测量当前速度、总距离和总行驶时间。
现在我想添加一个额外的功能,如果速度增加 40 公里/小时,我会打开图片并使用前置摄像头拍照。
我对实现这个感到困惑,因为位置是作为单独的 LocationService 类提供的。我查看了很多示例,但无法将其应用到我的代码中。
我尝试使用 Intent 将速度变量传回主 Activity ,但无法继续,因为我的速度变量会不断变化。
我还尝试为文本字段放置一个监听器,以便我可以对其进行监控,但这样做效率非常低。
这是我的 MainActivity.java
package com.example.location;
public class MainActivity extends AppCompatActivity {
LocationService myService;
static boolean status;
LocationManager locationManager;
static TextView dist, time, speed, satellite;
Button start, pause, stop;
static long startTime, endTime;
static ImageView image,imageView;
static ProgressDialog locate;
static int p = 0;
private static final int REQUEST_CODE_PERMISSION = 2;
String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;
private Uri file;
private ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LocationService.LocalBinder binder = (LocationService.LocalBinder) service;
myService = binder.getService();
status = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
status = false;
}
};
void bindService() {
if (status == true)
return;
Intent i = new Intent(getApplicationContext(), LocationService.class);
bindService(i, sc, BIND_AUTO_CREATE);
status = true;
startTime = System.currentTimeMillis();
}
void unbindService() {
if (status == false)
return;
Intent i = new Intent(getApplicationContext(), LocationService.class);
unbindService(sc);
status = false;
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (status == true)
unbindService();
}
@Override
public void onBackPressed() {
if (status == false)
super.onBackPressed();
else
moveTaskToBack(true);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dist = (TextView) findViewById(R.id.distancetext);
time = (TextView) findViewById(R.id.timetext);
speed = (TextView) findViewById(R.id.speedtext);
start = (Button) findViewById(R.id.start);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
image = (ImageView) findViewById(R.id.image);
imageView = (ImageView)this.findViewById(R.id.imageView1);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//The method below checks if Location is enabled on device or not. If not, then an alert dialog box appears with option
//to enable gps.
if (checkGPS() == false){
requestGPS();
}
requestcamera();
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
return;
}
if (status == false)
//Here, the Location Service gets bound and the GPS Speedometer gets Active.
bindService();
locate = new ProgressDialog(MainActivity.this);
locate.setIndeterminate(true);
locate.setCancelable(false);
locate.setMessage("Getting Location...");
locate.show();
start.setVisibility(View.GONE);
pause.setVisibility(View.VISIBLE);
pause.setText("Pause");
stop.setVisibility(View.VISIBLE);
}
});
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (pause.getText().toString().equalsIgnoreCase("pause")) {
pause.setText("Resume");
p = 1;
} else if (pause.getText().toString().equalsIgnoreCase("Resume")) {
if (checkGPS() == false){
requestGPS();
}
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
//Toast.makeText(this, "GPS is Enabled in your devide", Toast.LENGTH_SHORT).show();
return;
}
pause.setText("Pause");
p = 0;
}
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (status == true)
unbindService();
start.setVisibility(View.VISIBLE);
pause.setText("Pause");
pause.setVisibility(View.GONE);
stop.setVisibility(View.GONE);
p = 0;
}
});
}
private boolean checkGPS() {
int result = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
//If permission is granted returning true
if (result == PackageManager.PERMISSION_GRANTED)
return true;
//If permission is not granted returning false
return false;
}
private void requestcamera(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
}
}
private void requestGPS() {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION);
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION);
}
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
showGPSDisabledAlertToUser();
}
}
private void showGPSDisabledAlertToUser() {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("Enable GPS to use application")
.setCancelable(false)
.setPositiveButton("Enable GPS",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent callGPSSettingIntent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(callGPSSettingIntent);
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = alertDialogBuilder.create();
alert.show();
}
}
这是我的 LocationService.java
public class LocationService extends Service implements
LocationListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private static final long INTERVAL = 1000 * 2;
private static final long FASTEST_INTERVAL = 1000 * 1;
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
Location mCurrentLocation, lStart, lEnd;
static double distance = 0;
double speed;
int data;
private static final int CAMERA_REQUEST = 1888;
private static final int MY_CAMERA_PERMISSION_CODE = 100;
private final IBinder mBinder = new LocalBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
createLocationRequest();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
return mBinder;
}
protected void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onConnected(Bundle bundle) {
try {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
} catch (SecurityException e) {
}
}
protected void stopLocationUpdates() {
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, this);
distance = 0;
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onLocationChanged(Location location) {
MainActivity.locate.dismiss();
mCurrentLocation = location;
if (lStart == null) {
lStart = mCurrentLocation;
lEnd = mCurrentLocation;
} else
lEnd = mCurrentLocation;
//Calling the method below updates the live values of distance and speed to the TextViews.
speed = location.getSpeed() * 18 / 5;
updateUI();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
public class LocalBinder extends Binder {
public LocationService getService() {
return LocationService.this;
}
}
//The live feed of Distance and Speed are being set in the method below .
private void updateUI() {
if (MainActivity.p == 0) {
distance = distance + (lStart.distanceTo(lEnd) / 1000.00);
MainActivity.endTime = System.currentTimeMillis();
long diff = MainActivity.endTime - MainActivity.startTime;
diff = TimeUnit.MILLISECONDS.toMinutes(diff);
MainActivity.time.setText("Total Time: " + diff + " minutes");
if (speed > 0.0)
MainActivity.speed.setText("Current speed: " + new DecimalFormat("#.##").format(speed) + " km/hr");
else
MainActivity.speed.setText(".......");
MainActivity.dist.setText(new DecimalFormat("#.###").format(distance) + " Km's.");
MainActivity.satellite.setText(" Satellites in use: "+ data);
lStart = lEnd;
}
}
@Override
public boolean onUnbind(Intent intent) {
stopLocationUpdates();
if (mGoogleApiClient.isConnected())
mGoogleApiClient.disconnect();
lStart = null;
lEnd = null;
distance = 0;
return super.onUnbind(intent);
}
}
如有任何想法,我们将不胜感激。
最佳答案
为了能够通过 verce 与 activity
通信。
我建议您阅读此博客以更好地理解。
https://medium.com/@ankit_aggarwal/ways-to-communicate-between-activity-and-service-6a8f07275297
关于java - 在 LocationServices 和 MainActivity 之间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57912191/
当位置可用时,我想返回当前的用户位置。 这是我的代码: fusedLocationClient = LocationServices.getFusedLocationProviderClient(th
我正在尝试创建一个 GPSTracker 类,我可以从一个 fragment 运行它来获取用户的 GPS 位置。我有一个运行良好,除了它需要愚蠢的棉花糖许可支持(我知道这并不愚蠢,我实际上喜欢它,但它
我正在尝试使用使用用户位置的 android studio 构建一个 android 应用程序。我正在尝试导入 google play services LocationServices api,但它
到目前为止受影响的设备: Xperia 1 II 小米红米 Note 7 使用:为了请求位置更新,我检查了位置设置事先是足够的。如果没有,我会显示一个小文本,表示服务必须为我的功能启用。如果用户点击它
我正在尝试使用以下代码获取我的 Android 应用程序的纬度和经度。 public class MainActivity extends AppCompatActivity { privat
我的代码是: if (mGoogleApiClient == null && checkGooglePlayService()) { Log.d(Utils.TAG_DEV + TAG
有人知道使用 LocationServices.GeofencingApi 的示例吗?我发现的所有 android 地理围栏示例都使用已弃用的 LocationClient 类。据我所知,可以使用 L
我正在尝试获取用户最后已知的位置。 连接 Google API 后,我调用我的函数: @Override public void onConnected(Bundle bundle) { in
我似乎做不到GoogleApiClient从事我的项目。我正在使用 LocationServices , OnConnected即使我有 client.connect() 也没有开火在 onStart
我没有使用 LocationManager,而是使用 LocationServices 方法来获取当前的 gps 位置和位置更新。 这是代码: public void onConnected(@Nul
我正在尝试使用 GoogleAPIClient 获取实时位置更新。虽然 GoogleAPIClient 已连接但位置对象为空,并且它提示 location.getProvider() 为空。有人可以帮
我正在 Visual Studio 2017 上使用 Xamarin 创建一个 Android 应用程序。我正在尝试使用本指南(http://www.c-sharpcorner.com/blogs/f
我想实现自己的定位服务。它将基于附近接入点的 wifi 信号强度的三角测量。 我知道确定我的位置的算法,但我不知道如何将它集成到我的代码中以便我可以简单地向我的服务添加一个 LocationListe
我只是想做一个简单的“教程”应用程序来获取我手机的位置(以了解稍后如何在其他应用程序中使用它),但我就是一无所获。 我做了什么 Android 开发人员教程: 首先,我遵循了 Android 开发人员
我不明白为什么 LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,
我正在 Android 上使用 Google Play 服务位置 API,我正在尝试弄清楚如何测试 onConnectionSuspended(int Cause) 回调,该回调是 GoogleApi
我正在开发一个 Android 库,我需要删除由使用我的库的开发人员添加的播放服务依赖项。我需要用户位置最后一个位置,所以我需要使用反射,因为位置库不会直接包含在我的库中。 但是如何通过反射从构建器创
你好 Stackoverflow 社区,我是 android 的新手,正在学习如何实现基于位置的服务。 我成功地实现了一个速度计应用程序,它可以测量当前速度、总距离和总行驶时间。 现在我想添加一个额外
我已经在其他线程中阅读了该问题的解决方案,但我似乎不明白为什么它会返回 null。我使用了谷歌开发者网站提供的相同 fragment :https://developer.android.com/tr
我有一个高优先级的项目正在开发中。 我正在尝试将地理位置插入数据库,因此我找到了在线服务,不幸的是 LocationRequest 和 LocationServices.API 未解析。 我正在使用依
我是一名优秀的程序员,十分优秀!