小编Md.*_*rim的帖子

Android GPS定位精度问题

我正在研究android中的gps跟踪应用程序.这是我的代码架构:

  1. BackgroundSyncService:用于获取位置更新的服务类.这里GoogleApiClient已初始化并实现了其他与位置相关的方法.
  2. AppRunCheckerReceiver:一个BroadcastReceiver类,它将BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果它停止然后它开始.
  3. GpsEnableReceiver:如果gps状态改变,它将触发的BroadcastReceiver.它将BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果它停止然后它开始.
  4. InternetConnectionStateReceiver:Internet状态更改时将触发的BroadcastReceiver.它将BackgroundSyncService在一个时间间隔内检查我是否正在运行.如果停止,则启动.

在我的BackgroundSyncService服务中,我使用以下方式初始化GoogleApiClient:

public void setLocationLocationRequest() {

        try {
            googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).addApi(com.google.android.gms.location.LocationServices.API).build();

            locationRequest = new LocationRequest();
            locationRequest.setInterval(3000);
            locationRequest.setFastestInterval(3000);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            googleApiClient.connect();
        } catch (Exception e) {

    }
Run Code Online (Sandbox Code Playgroud)

这里是accuricy LocationRequest.PRIORITY_HIGH_ACCURACY和间隔

locationRequest.setInterval(3000)
Run Code Online (Sandbox Code Playgroud)

是GoogleApiClient实现代码.

应用程序GPS信息部分包含纬度经度和精度参数

我的发现:onLocationChanged(Location location)方法中我用这种方式检查Location对象的准确性:location.getAccuracy().如果精度小于50米,那么我接受它.

在85%的情况下,它像魅力一样工作.它向我发送GPS的确切位置.但在15%的情况下,它给我发送了不准确的位置,如超过300米.

15%的设备是低成本的中国品牌手机.

我的问题:

  1. 如何使准确度达到99%左右.我的代码架构有什么问题吗?
  2. GPS精度是否取决于设备配置?如果是,那么我可以为低配置设备做什么?
  3. Uber,Go-JEK等车载共享应用程序如何适用于所有设备?他们是否只有GPS的额外编码?
  4. 我的申请是孟加拉国.互联网很慢.它对GPS精度有负面影响吗?

在此先感谢此主题.并且抱歉英语不好.

gps android tracking

32
推荐指数
3
解决办法
1万
查看次数

当应用处于后台状态时,Google FCM getIntent不会返回预期数据

我正在我的应用程序中实现FCM(Firebase消息服务).这里似乎都没问题,除非app处于后台状态我无法提取预期的通知数据.

基于概念:FCM中有两种类型的消息:

display-messages:这些消息仅在您的应用处于前台时才有效.

数据消息:即使您的应用处于后台,这些消息也能正常工作当我们的应用处于后台时,Android会将通知消息定向到系统托盘.

处理数据消息时,您的通知应具有click_action ="YOUR_ACTION"字段.

我的信息会是这样的:

{
 "data": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}
Run Code Online (Sandbox Code Playgroud)

活动将显示清单文件将如下所示的消息:

<activity
            android:name=".NotificationActivity"
            android:screenOrientation="portrait"
            android:theme="@style/Theme.AppCompat.Dialog"
            android:windowSoftInputMode="stateHidden" >

            <intent-filter>
                <action android:name="YOUR_ACTION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
Run Code Online (Sandbox Code Playgroud)

点击通知后,它将重定向到我的NotificationActivity.在我的NotificationActivityin onCreateonNewIntent方法中,我使用这种方式提取消息:

Bundle bundle=getIntent().getExtras();
        if(bundle!=null) {
            for (String key : bundle.keySet()) {
                Object value = bundle.get(key);
                Log.d("DATA_SENT", String.format("%s %s (%s)", key,
                        value.toString(), value.getClass().getName()));
            }
        } …
Run Code Online (Sandbox Code Playgroud)

android firebase firebase-cloud-messaging

8
推荐指数
1
解决办法
1万
查看次数

Mifare Classic 1K的锁定机制

Mifare Classic 1K的程序是

  1. 轮询标签
  2. 验证这些标签
  3. 如果验证成功,则读/写.

我已经完成了这些程序,并且还从特定部门读取和写入数据.

标签的轮询命令是

new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,
                (byte) 0x00, (byte) 0x04, (byte) 0xD4, (byte) 0x4A,
                (byte) 0x01, (byte) 0x00 }
Run Code Online (Sandbox Code Playgroud)

验证命令

new byte[] { (byte) 0xFF, (byte) 0x86, (byte) 0x00,
                (byte) 0x00, (byte) 0x05, (byte) 0x01,(byte) 0x00, (byte) 0x04, 
                                    (byte) 0x60,(byte) 0x00 };
Run Code Online (Sandbox Code Playgroud)

这里"(字节)0x01"是扇区1

并且在扇区1上写入,块5是

new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,(byte) 0x00, (byte) 0x15, (byte) 0xD4,
             (byte)    0x40,(byte) 0x01, (byte) 0xA0, (byte) 0x05,(byte) 0x01, …
Run Code Online (Sandbox Code Playgroud)

java rfid nfc mifare contactless-smartcard

5
推荐指数
1
解决办法
2852
查看次数

Docker容器中的Spring Boot应用程序端口映射

在我的 application.yml 文件中,我添加了 8080 上的服务器端口。

server:
  port: 8080
Run Code Online (Sandbox Code Playgroud)

现在在我的 Dockerfile 中,我公开了端口范围8080-8089。我的目标是在不同的外部和内部端口上运行此映像。

我的 Dockerfile 如下

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} user-service.jar
EXPOSE 8000-8089

ENTRYPOINT ["java","-jar","/user-service.jar"]
Run Code Online (Sandbox Code Playgroud)

我的 docker 镜像构建命令如下:

docker image build -t user-service .
Run Code Online (Sandbox Code Playgroud)

现在构建此映像后,我的 docker run 命令如下:

docker run -d -p 8080:8080  -it user-service
Run Code Online (Sandbox Code Playgroud)

这里,user-service是我的 docker 镜像 TAG。之后,我可以在 8080 端口上访问该应用程序。

但问题是,当我使用端口映射 -p 8081:8081 运行另一个容器时,应用程序正在运行,但无法使用端口 8081 进行访问。

我的 docker 运行命令是:

docker run -d -p 8081:8081  -it user-service
Run Code Online (Sandbox Code Playgroud)

现在我的目标是我想用 docker 中的外部和内部端口映射跳过 application.yml 服务器端口

注意事项

  1. 这是 .jar …

docker spring-boot dockerfile docker-run

3
推荐指数
2
解决办法
1万
查看次数

使用try catch,Spring @Transactional anotation无法在for循环中工作

我的问题如下.伪代码如下:

public Object rollBackTestMainMethod(List<Object> list) {

  List<Object> responseList = new ArrayList<>();

  for(Object item:list){

    try{    
      Boolean isOperationSuccess = rollBackTestSubMethod(item);
      if (isOperationSuccess==null || !isOperationSuccess){
        item.addError("Operation failed");
        item.addSuccess(false);
      } else {
        item.addError(null);
        item.addSuccess(true);
      }

    } catch(Exception exception) {
      item.addError(exception.getMessage());
      item.addSuccess(false);
    }

    responseList.add(item);
  }

  return responseList;
}

@Transactional(rollbackFor = {Exception.class, SQLException.class})
private Boolean rollBackTestSubMethod(Object listItem){

  Long value1=save(listItem.getValue1());
  if(value1==null){
    throw new Exception("Error during save 1");
  }

  Long value2=save(listItem.getValue2());
  if(value2==null){
    throw new Exception("Error during save 2");
  }
  Long value3=save(listItem.getValue3());
  if(value3==null){
    throw new Exception("Error during …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate spring-data-jpa spring-boot

1
推荐指数
1
解决办法
645
查看次数