我正在尝试在 Firebase TestLab 上使用 RoboScript 测试基于 Google 地图的 Android 应用程序。默认情况下,TestLab 设备上禁用位置。要启用它们,我们需要模拟单击系统提示上的“确定”按钮。但这种点击永远不会发生。您可以看到下面的屏幕截图。“确定”按钮永远不会被按下,流程将在此停止。
我检查了 RoboScript json 文件。Android studio 从未记录过“确定”按钮的点击。我尝试创建另一个元素,如下所示。但无法确定系统对话框的resourceId 应该是什么。
{
"eventType": "VIEW_CLICKED",
"timestamp": 1512127956674,
"replacementText": "",
"actionCode": -1,
"delayTime": 0,
"canScrollTo": false,
"elementDescriptors": [
{
"className": "android.widget.LinearLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.entransys.parkeze:id/confirm_linear",
"contentDescription": "",
"text": ""
},
{
"className": "android.support.v7.widget.ContentFrameLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 1,
"resourceId": "android:id/content",
"contentDescription": "",
"text": ""
},
{
"className": "android.support.v7.widget.FitWindowsLinearLayout",
"recyclerViewChildPosition": -1,
"adapterViewChildPosition": -1,
"groupViewChildPosition": 0,
"resourceId": "com.entransys.parkeze:id/action_bar_root",
"contentDescription": "",
"text": "" …Run Code Online (Sandbox Code Playgroud) 我使用带有 fused api 的已启动服务,并直接在其上实现位置侦听器。即使屏幕锁定,位置也会持续更新,但如果屏幕关闭,位置就会停止。
那么,有没有什么方法可以确保屏幕关闭时位置保持更新呢?
我读了很多其他问题,但我真的不知道我错过了什么。
public class CLocationService extends Service implements GoogleApiClient.ConnectionCallbacks, LocationListener,
GoogleApiClient.OnConnectionFailedListener {
private GoogleApiClient mGoogleApiClient;
private PowerManager.WakeLock mWakeLock;
private LocationRequest mLocationRequest;
// Flag that indicates if a request is underway.
private boolean mInProgress;
private Boolean servicesAvailable = false;
private boolean isStarted;
public static final int LOCATION_SERVICE_NOTIFICATION_ID = 4567654;
private void showNotification() {
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification notification = new Notification.Builder(this)
.setContentTitle(getText(R.string.app_name))
.setContentText("")
.setSmallIcon(R.mipmap.ic_notification)
.setContentIntent(pendingIntent)
.setTicker("")
.build(); …Run Code Online (Sandbox Code Playgroud) 我在打ze睡模式下尝试在我的android应用中获取位置更新,该更新以前可以在android 5.x上使用。随着android 6和doze的出现,无论我做什么,更新都会在某个时候停止。在阅读了有关该主题的几篇文章和stackoverflow答案之后,我进行了以下更改:
但是,无论何时打do睡,我都没有得到位置更新。我已经验证了打do睡开始时(通过定期记录消息)我的服务线程保持运行,但是位置管理器以某种方式停止发送更新。在这方面,关于Manager睡和LocationManager的文档非常少,所以我想知道是否有人知道一种使位置管理器在do睡中存活的方法?LocationManager上是否有某种方法,如果定期调用该方法,可以使LocationManager保持活动状态?请注意,我只对GPS更新感兴趣,更新频率很高,每秒更新一次。
我正在使用谷歌地图 V2,我需要显示自定义图像按钮单击以获取带有蓝点的当前位置,并且没有显示到 setMyLocationEnabled 按钮。并且此方法已经错误,但显示当前位置但不显示蓝点。
googleMap.setMyLocationEnabled(false);
Run Code Online (Sandbox Code Playgroud) 我有一部已 root 的手机 Samsung N7100 (kitkat 4.4.2)。2019 年 4 月 6 日之后,我开始获取日期为 1999 年的地点。
有时,位置信息的日期为 2019 年,但此后设备将停止接收任何位置信息。
只有 adb 命令有帮助,但一段时间后设备将停止接收任何位置。
settings put secure location_providers_allowed -gps
settings put secure location_providers_allowed +gps
Run Code Online (Sandbox Code Playgroud)
我已经尝试将固件更新到 android 6 和 7。没有任何帮助。
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, this);
....
public void onLocationChanged(Location location) {
Log.d(TAG, (new Date(location.getTime())).toLocaleString());
}
Run Code Online (Sandbox Code Playgroud) 我想检测用户是否在运行时关闭了该位置。我可以检查他是否打开了它,或者在应用程序启动之前用户是否关闭了位置,但我无法检查他是否在之后关闭了它。
代码示例:
MapEntity扩展LocationListener
class MapViewer(a: MainActivity, parentView: ViewGroup) : MapEntity(a, parentView) {
override fun onProviderEnabled(provider: String?) {
activity.hideGpsSnackbar()
}
override fun onProviderDisabled(provider: String?) {
activity.showGpsSnackbar()
}
}
Run Code Online (Sandbox Code Playgroud)
对于实时 GPS 位置检查,我正在使用 GnssStatus.Callback()
更新:
我已经BroadcastReceiver根据下面的答案创建了。
abstract class GPSReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
try {
val locationManager = context.getSystemService(LOCATION_SERVICE) as LocationManager
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
onGpsChanged(true)
} else {
onGpsChanged(false)
}
} catch (ex: Exception) {
App.log("IsGPSEnabled: $ex")
}
}
abstract fun onGpsChanged(isEnabled: Boolean)
} …Run Code Online (Sandbox Code Playgroud) 我是 android 的初学者,我无法理解为什么我会出错。当我单击主页按钮(底部导航栏)时,我收到此错误。我正在使用共享首选项来保存我的值,但是当检索到该值时,就会出现错误。
我的活动代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLastLocation();
binding.bottmNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.home1: //when i m clicking here
setFragment(homeFragment);
SharedPreferences shprefs = getSharedPreferences(prefs, MODE_PRIVATE);
SharedPreferences mprefs = getSharedPreferences(myprefs, MODE_PRIVATE);
String savedvalue = shprefs.getString("savedvalue", null);
String savedcountry = mprefs.getString("savedcountry", null);
if ((savedvalue != null && savedvalue.equals("India")) || savedcountry.equals("India")) {
newsModels.clear();
binding.bottmNav.getMenu().findItem(R.id.location).setTitle("India");
binding.bottmNav.getMenu().findItem(R.id.home1).setChecked(true);
setindianewsdata();
setindiashopdata();
setFragment(homeFragment);
} else if (savedvalue.equals("Usa") || savedcountry.equals("Usa")) {
newsModels.clear();
setusanewsdata();
setusashopdata();
setFragment(homeFragment);
binding.bottmNav.getMenu().findItem(R.id.location).setTitle("USA"); …Run Code Online (Sandbox Code Playgroud) 我已经浏览了一些处理这个问题的资源,但没有一个提供令人满意的解释或解决方案。我浏览过的一些内容是:
打开/关闭 wifi 或 gps 时,我的 BroadcastReceiver 被调用两次?
android.location.PROVIDERS_CHANGED BroadcastReceiver 多次触发
因此,我重新发布这个问题。
问题陈述很简单,我有一个广播接收器,每当设备的 GPS/位置状态发生变化时就会触发该接收器。问题在于 onReceive() 方法被多次调用(准确地说是 4 次)。
我已在清单文件中注册了我的接收器(而不是其他地方):
<receiver android:name=".broadcasts.DeviceGpsStatusReceiver">
<intent-filter>
<action android:name="android.location.PROVIDERS_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
我还确保该接收器未在我的应用程序中的其他任何地方注册。
广播接收器的设计如下:
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
// my content
}
}
Run Code Online (Sandbox Code Playgroud)
即使进行了此更改,我仍然看到 onReceive() 重写方法被多次触发。为什么会这样呢?有办法解决这个问题吗?
背景: 我们有一个应用程序可以为一群人进行时间登记。在此示例中,我们使用 Zebra TC26(型号:TC26BK-11A222-A6),并通过扫描对多人进行打卡。接下来,应用程序会跟踪手机的 GPS 位置,以定位在哪个字段中执行活动。然后,农民可以更准确地计算每块田地的成本。
这个功能在 android 10 之前都工作得很好。现在我的设备上在 1 小时或 1 小时 30 分后我没有得到新的位置。在另一台设备上,我有时会得到更长的时间,但也会停止。从Android 10开始我遇到了问题,我在网上找到了很多信息,但似乎并没有解决问题。正常工作日:
所以在工作期间他们不使用手机。
额外的:
清单:(我遗漏了一些权限和 antiDozeService,因为我认为它们与 GPS 部分无关)
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<activity android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category …Run Code Online (Sandbox Code Playgroud) 我有 2 个点(Android Location 对象):当前位置和目标位置。我还有设备的方向(以度为单位)。
我想计算目标位置和方向之间的角度。怎样做才正确呢?
我从 FusedLocationProvider 接收位置(如果有的话)。现在我只用
float requiredAngle = Math.abs(location.getBearing() - 180 - target.bearingTo(location));
float angleBetween = Math.abs(requiredAngle - location.getBearing());
它返回的角度不正确。
我想我应该计算真北和磁北之间的差异并添加设备方向。然后使用 currentPosition.bearingTo(target),并从方位中减去设备方向。
android ×10
android-gps ×10
location ×2
android-10.0 ×1
android-11 ×1
android-doze ×1
firebase ×1
geometry ×1
gps ×1
java ×1
kotlin ×1
service ×1