oppo和小米手机无法使用后台定位服务

2024-04-24

在我的android应用程序中,位置服务作为后台服务实现。我已经用不同的手机(如三星,micromax,Moto,lenovo,nexus)测试了它,它在所有手机上都能正常工作。但是当我在Oppo(colorOS)和MI( MIUI OS),我的服务在一段时间后停止。我已经使用 MainActivity.this.finish() 完成了 MainActivity。


将以下代码放在您的 Activity 的 oncreate() 方法之上:


private FusedLocationProviderClient mFusedLocationClient;
    EasyPermissionsLocation.PermissionCallbacks permissionCallbacks = new EasyPermissionsLocation.PermissionCallbacks() {
        @Override
        public void onPermissionsGranted(int requestCode, List perms) {

            LocationRequest mLocationRequest = new LocationRequest();
            mLocationRequest.setInterval(10000);
            mLocationRequest.setFastestInterval(5000);
            mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                        .addLocationRequest(mLocationRequest);

            SettingsClient client = LocationServices.getSettingsClient(SurveyActivity.this);
            Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
            task.addOnSuccessListener(SurveyActivity.this, new OnSuccessListener<LocationSettingsResponse>() {
                @Override
                public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
                    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(SurveyActivity.this);
                    if (ActivityCompat.checkSelfPermission(SurveyActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                            && ActivityCompat.checkSelfPermission(SurveyActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    mFusedLocationClient.getLastLocation()
                            .addOnSuccessListener(SurveyActivity.this, new OnSuccessListener<Location>() {
                                @Override
                                public void onSuccess(Location location) {
                                    if (location != null) {
                                        ((SurveyApp)getApplication()).getUser().getCurrentSurvey().setLat(""+location.getLatitude());
                                        ((SurveyApp)getApplication()).getUser().getCurrentSurvey().setLng(""+location.getLongitude());
                                        Toast.makeText(SurveyActivity.this, "Location Captured", Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });

                }
            });

            task.addOnFailureListener(SurveyActivity.this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    if (e instanceof ResolvableApiException) {
                        try {
                            ResolvableApiException resolvable = (ResolvableApiException) e;
                            resolvable.startResolutionForResult(SurveyActivity.this,
                                    REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException sendEx) {
                        }
                    }
                }
            });
    }


        @Override
        public void onPermissionsDenied(int requestCode, List perms, final boolean isAutoDenied) {
            if (isAutoDenied) {
                showDialog(getString(R.string.permanently_deny_location));
            }
        }

        @Override
        public void onPermissionsPermanentlyDeclined(int requestCode, List perms) {
            showDialog(getString(R.string.permanently_deny_location));
        }
    };

从 oncreate 方法()调用上面的代码:-

   EasyPermissionsLocation.requestPermissions(this, permissionCallbacks, getString(R.string.location_message), 100, Manifest.permission_group.LOCATION);

创建这个类:

public class EasyPermissionsLocation {

private static final String TAG = "EasyPermissions";
private static long timeWhenRequestingStart;
private static Object object;
private static AlertDialog dialog;
private static PermissionCallbacks callbacks;
private static HashMap<String, String[]> permissionGroups;
private static boolean shouldShowRationale = false;

public static boolean hasPermissions(Context context, String... perms) {
    // Always return true for SDK < M, let the system deal with the permissions
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        Log.w(TAG, "hasPermissions: API version < M, returning true by default");
        return true;
    }

    for (String perm : perms) {
        boolean hasPerm = (ContextCompat.checkSelfPermission(context, perm) ==
                PackageManager.PERMISSION_GRANTED);
        if (!hasPerm) {
            return false;
        }
    }

    return true;
}

public static void requestPermissions(final Object object, PermissionCallbacks callback, String rationale,
                                      final int requestCode, final String... perms) {
    requestPermissions(object, callback, rationale,
            android.R.string.ok,
            android.R.string.cancel,
            requestCode, perms);
}

public static void requestPermissions(final Object obj, final PermissionCallbacks callback, String rationale,
                                      @StringRes int positiveButton,
                                      @StringRes int negativeButton,
                                      final int requestCode, final String... permission) {

    callbacks = callback;
    object = obj;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        // only for lower of M
        callbacks.onPermissionsGranted(requestCode, new ArrayList<String>(Arrays.asList(permission)));
        return;
    }


    checkCallingObjectSuitability(object);
    final String[] perms = getActualPermissions(object,
            permission);


    if (perms.length <= 0) {
        callbacks.onPermissionsGranted(requestCode, new ArrayList<String>(Arrays.asList(permission)));
        return;
    }

    shouldShowRationale = false;
    for (String perm : perms) {
        shouldShowRationale = shouldShowRationale || shouldShowRequestPermissionRationale(object, perm);
    }

    if (shouldShowRationale) {
        if (!TextUtils.isEmpty(rationale)) {
            if (dialog == null) {
                dialog = new AlertDialog.Builder(getActivity(object))
                        .setMessage(rationale)
                        .setCancelable(false)
                        .setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog1, int which) {
                                executePermissionsRequest(object, perms, requestCode);
                                dialog.dismiss();
                            }
                        })
                        .create();
            } else {
                dialog.setMessage(rationale);
            }
            dialog.show();
        } else {
            executePermissionsRequest(object, perms, requestCode);
        }
    } else {
        timeWhenRequestingStart = System.currentTimeMillis();
        executePermissionsRequest(object, perms, requestCode);
    }
}

private static String[] getActualPermissions(Object object, String[] permission) {
    initPermissionGroups();
    ArrayList<String> permissionList = new ArrayList<String>();
    for (String indiPerm : permission) {
        if (permissionGroups.containsKey(indiPerm)) {
            String[] arr = permissionGroups.get(indiPerm);
            for (String s : arr) {
                if (!EasyPermissionsLocation.hasPermissions(getActivity(object), s)) {
                    permissionList.add(s);
                }
            }
        } else {
            if (!EasyPermissionsLocation.hasPermissions(getActivity(object), indiPerm)) {
                permissionList.add(indiPerm);
            }
        }
    }

    Set<String> set = new LinkedHashSet<String>(permissionList);

    return set.toArray(new String[set.size()]);
}

private static void initPermissionGroups() {
    if (permissionGroups == null) {
        permissionGroups = new HashMap<String, String[]>();
        permissionGroups.put(Manifest.permission_group.CALENDAR, new String[]{Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR});
        permissionGroups.put(Manifest.permission_group.CAMERA, new String[]{Manifest.permission.CAMERA});
        permissionGroups.put(Manifest.permission_group.CONTACTS, new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS, Manifest.permission.GET_ACCOUNTS});
        permissionGroups.put(Manifest.permission_group.LOCATION, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION});
        permissionGroups.put(Manifest.permission_group.MICROPHONE, new String[]{Manifest.permission.RECORD_AUDIO});
        permissionGroups.put(Manifest.permission_group.PHONE, new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE, Manifest.permission.READ_CALL_LOG, Manifest.permission.WRITE_CALL_LOG, Manifest.permission.ADD_VOICEMAIL, Manifest.permission.USE_SIP, Manifest.permission.PROCESS_OUTGOING_CALLS});
        permissionGroups.put(Manifest.permission_group.SENSORS, new String[]{Manifest.permission.BODY_SENSORS});
        permissionGroups.put(Manifest.permission_group.SMS, new String[]{Manifest.permission.SEND_SMS, Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_WAP_PUSH, Manifest.permission.RECEIVE_MMS});
        permissionGroups.put(Manifest.permission_group.STORAGE, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE});
    }
}

public static void onRequestPermissionsResult(int requestCode, String[] permissions,
                                              int[] grantResults) {

// checkCallingObjectSuitability(对象); // PermissionCallbacks 回调 = (PermissionCallbacks) 对象;

    // Make a collection of granted and denied permissions from the request.
    boolean showRationale = false;
    ArrayList<String> granted = new ArrayList<>();
    ArrayList<String> denied = new ArrayList<>();
    for (int i = 0; i < permissions.length; i++) {
        String perm = permissions[i];
        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
            granted.add(perm);
        } else {
            showRationale = shouldShowRequestPermissionRationale(object, perm);
            if (!showRationale) {
                timeWhenRequestingStart = System.currentTimeMillis() - 2;
            }
            denied.add(perm);
        }
    }
    boolean isPermenantlyDisabled = false;
    // Report granted permissions, if any.
    if (!granted.isEmpty() && denied.isEmpty()) {
        // Notify callbacks
        callbacks.onPermissionsGranted(requestCode, granted);
    }

    //if 100% fail then check for whether timing
    else if (granted.isEmpty() && !denied.isEmpty()) {
        if (!shouldShowRationale && !showRationale) {
            if (callbacks != null) {
                callbacks.onPermissionsDenied(requestCode, denied, true);
            }
        } else {
            long diff = System.currentTimeMillis() - timeWhenRequestingStart;
            if (diff < 150) {
                //means it is permenantly disabled
                isPermenantlyDisabled = true;
                if (callbacks != null) {
                    callbacks.onPermissionsPermanentlyDeclined(requestCode, denied);
                }
            }
            Log.i("TAG", diff + "");
        }

    }
    else if (!denied.isEmpty() && !isPermenantlyDisabled) {
        callbacks.onPermissionsDenied(requestCode, denied, false);
    }

}

@TargetApi(23)
private static boolean shouldShowRequestPermissionRationale(Object object, String perm) {
    if (object instanceof Activity) {
        return ActivityCompat.shouldShowRequestPermissionRationale((Activity) object, perm);
    } else if (object instanceof Fragment) {
        return ((Fragment) object).shouldShowRequestPermissionRationale(perm);
    } else if (object instanceof android.app.Fragment) {
        return ((android.app.Fragment) object).shouldShowRequestPermissionRationale(perm);
    } else {
        return false;
    }
}

@TargetApi(23)
private static void executePermissionsRequest(Object object, String[] perms, int requestCode) {
    checkCallingObjectSuitability(object);

    if (object instanceof Activity) {
        ActivityCompat.requestPermissions((Activity) object, perms, requestCode);
    } else if (object instanceof Fragment) {
        ((Fragment) object).requestPermissions(perms, requestCode);
    } else if (object instanceof android.app.Fragment) {
        ((android.app.Fragment) object).requestPermissions(perms, requestCode);
    }
}

@TargetApi(11)
private static Activity getActivity(Object object) {
    if (object instanceof Activity) {
        return ((Activity) object);
    } else if (object instanceof Fragment) {
        return ((Fragment) object).getActivity();
    } else if (object instanceof android.app.Fragment) {
        return ((android.app.Fragment) object).getActivity();
    } else {
        return null;
    }
}

private static void checkCallingObjectSuitability(Object object) {
    // Make sure Object is an Activity or Fragment
    boolean isActivity = object instanceof Activity;
    boolean isSupportFragment = object instanceof Fragment;
    boolean isAppFragment = object instanceof android.app.Fragment;
    boolean isMinSdkM = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;

    if (!(isSupportFragment || isActivity || (isAppFragment && isMinSdkM))) {
        if (isAppFragment) {
            throw new IllegalArgumentException(
                    "Target SDK needs to be greater than 23 if caller is android.app.Fragment");
        } else {
            throw new IllegalArgumentException("Caller must be an Activity or a Fragment.");
        }
    }

}

public interface PermissionCallbacks {

    void onPermissionsGranted(int requestCode, List<String> perms);

    void onPermissionsDenied(int requestCode, List<String> perms, boolean isAutoDenied);

    void onPermissionsPermanentlyDeclined(int requestCode, List<String> perms);

}

}


添加在清单中:-

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

在应用程序 gradle 文件中添加以下内容:

 implementation 'com.google.android.gms:play-services-location:11.8.0'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oppo和小米手机无法使用后台定位服务 的相关文章

  • Google+集成:无法加载可见圈子

    我想在我的应用程序中从 google plus 获取人员信息列表 朋友个人资料图像 URL 可见名称和 ID Here s 官方 google plus 集成教程 https developers google com mobile and
  • 获取带有注释的所有类并将它们添加到 android 中的 hashMap

    我不确定这是否可能 但我基本上希望能够轻松地将新项目添加到列表中 只需添加带有特殊注释的类即可 我能想到的唯一例子就是我目前正在做的事情 用户可以完成很多 挑战 目前我的应用程序中有一个用于 挑战 的包 我希望能够在该包中创建一个新类 给它
  • AppCompatActivity 中的 setListAdapter

    我有一个具有功能的程序listArray with extends AppCompatActivity但我的代码有错误 my code 新闻活动 public class NewsActivity extends AppCompatActi
  • 允许我的应用程序用户从单个帐户发布推文

    我有一个小应用程序 可以显示我的小国家 比利时的公共交通交通问题 例如 我在应用程序中创建了一个系统 允许用户在火车延误时警告所有人 我想做的是允许我信任的用户从我的帐户发布类似 用户 X 说 123456 号列车晚点 3 分钟 之类的推文
  • 如何将内部类的值返回到外部类?

    我想做的是当onSuccess方法执行后 queryLogin return true 而如果onFailuer方法执行后 queryLogin return false 但如您所知 在 java 中 我无法从内部类修改外部类值 所以我只是
  • 缩放视图中的文本以适合?

    我不相信这存在 但想仔细检查一下 我想设置 TextView 的文本大小 使其适合给定宽度的单行 例子
  • 如何更改 Kindle Fire 上 /mnt/SDcard 文件夹的读/写权限?

    我正在尝试在 Android 中开发 Amazon In app 为此 我从该网站下载示例代码https developer amazon com sdk in app purchasing sample code button click
  • 手电筒打开时 Android 相机的奇怪行为

    我有以下 android 代码 这里用伪代码编写 mCamera configAndInitialize all I want to do before taking picture mCamera startPreview mCamera
  • Android 4.2.1 错误的字符字距调整(间距)

    使用时Canvas and drawText 方法我在 Android 4 2 1 上看到了不同的渲染 4 2 以下 对于 Android 4 2 1 Nexus 7 我得到 正如你所看到的文字消耗很紧 似乎是4 2 1中引入的字距调整问题
  • 我如何访问警报内容提供商

    我正在尝试访问警报提供商以获取所有启用的警报信息 所以我写了这个 public static final Uri CONTENT URI Uri parse content com android deskclock alarm Conte
  • 为什么桌面 AES 文件 IO 与 Android AES 文件 IO 不兼容?

    我已将一个应用程序从 Android 移植到桌面 该应用程序使用 AES 加密一些私人数据 两个应用程序都能够加密和解密数据以供自己使用 但无法解密其他应用程序的数据 AES 密钥 IV 和算法是相同的 这两个应用程序之间的主要区别在于 a
  • 从MySQL php中的特定列获取最大ID和最小ID

    我是新来的php现在尝试从中检索数据MySQL到安卓 这是我的工作细节 table In 检索总小时数函数 我想检索最短 ID 时间 and 最大 ID 超时 from MySQL到安卓通过php最后使用下面的代码来获取总小时数 假设 ID
  • Android 中识别点击的图像区域?

    有没有办法在 Android 应用程序中确定用户单击了 ImageView 的哪个区域 例如 x y 坐标 谢谢 查看运动事件 http developer android com intl de reference android vie
  • 使用 SearchView 后重置操作栏

    我在用着SearchView小部件以在我的应用程序中启用搜索 首次单击搜索图标后 SearchView小部件会扩展到搜索字段 并且应用程序图标旁边会显示 后退 箭头 如果我单击应用程序图标 操作栏将恢复到初始状态 没有 后退 箭头 并且Se
  • 渲染脚本渲染在Android上比OpenGL渲染慢很多

    背景 我想根据Android相机应用程序的代码添加实时滤镜 但Android相机应用程序的架构是基于OpenGL ES 1 x 我需要使用着色器来自定义我们的过滤器实现 然而 将相机应用程序更新到OpenGL ES 2 0太困难了 然后我必
  • 使用 Android 将文本文件上传到 Google Drive

    编辑 我已将文本设置为字符串 如下所示 字符串文本 你好 我想将其转换为纯文本文件 然后上传到 Google 云端硬盘文件夹 我已经尝试过下面的代码 但它不完整 所以我无法说出出现了什么错误 我正在使用 Google Drive 快速启动
  • Android EditText:在触摸时选择所有文本,并在用户开始输入时清除。

    我的应用程序中有一个编辑文本 当用户触摸编辑文本时 应选择整个文本 而当他开始输入文本时 应清除文本 一个例子是浏览器地址栏 有什么办法可以做到这一点吗 请帮助我 您可以使用以下方法选择 EditText 中的所有文本 android se
  • 尝试初始化 AudioRecord 时出现“无法获取记录源 1 的音频输入”

    当尝试初始化 AudioRecord 对象并尝试使用 Eclipse 使用模拟器录制声音时 我不断收到此错误 我尝试过各种位采样率 8000 是唯一有效的 但错误仍然出现 我尝试过各种版本的sdk 1 5 1 6 2 2 2和2 3 1 以
  • 不要使用android内置的org.json

    我写了一个使用的库org json http json org A 来自 json org 假设 Android 使用相同的 在 android 中也称为org json B 只是它遗漏了一些相对关键的功能 现在我想做的是设置我的 grad
  • TextView 用字母打乱了我的话

    我的要求 创建 传入气泡 其宽度按内容排列 最大宽度为 90 我有这个标记

随机推荐