- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 android 应用程序中,定位服务作为后台服务实现。我已经用不同的手机(如三星、micromax、Moto、lenovo、nexus)对其进行了测试,它适用于所有手机。但是当我在 Oppo (colorOS) 中运行时和 MI(MIUI 操作系统),我的服务在一段时间后停止。我用 MainActivity.this.finish() 完成了 MainActivity。
最佳答案
将以下代码放在 oncreate() 方法上方的 Activity 中:
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(object);//PermissionCallbacks 回调 = (PermissionCallbacks) object;
// 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);
}
在 list 中添加:-
<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'
关于android - 后台定位服务在 oppo 和 MI 手机中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49399308/
我在 Oppo 移动版 - Lollipop 版本中遇到问题。我需要在我的应用程序中写入联系人权限。但在 oppo lollipop 中它要求 oppo 自己的安全许可。如果我拒绝该权限,则应用程序会
此前网上曝光的OPPO Watch 2此番终于迎来发售,据悉,此次OPPO推出的这款全新手表功能非常强大,并且配置十分给力一度被网友们称之为史上最强安卓手表!下面一起来看看了解一下这款OPPO Wa
分享嘉宾:Xiaochun He OPPO,编辑整理:门君仪 澳洲国立大学 **导读:**OPPO是一家智能终端制造公司,有着数亿的终端用户,手机 、IoT设备产生的数据源源不断,设备的智能化服务需要
OPPO 手环今日正式支持通过手环回复微信消息,只需将固件升级到 A.00_0614,安装 2.7.1 版本的健康 App 以及 Android Auto,即可在手环上查看并回复微信消息。 IT之
9月29日消息今天中午,@OPPO 智美生活官方分享了一段视频,OPPO TV 联合 8KRAW 出品,用 4K 120 FPS 超高清画面,横跨天南地北,穿越春夏秋冬,带你领略色彩中国,谨以此片献
12月19日午间消息,在今日的OPPO开发者大会上,OPPO副总裁、新兴移动终端事业部总裁刘波宣布,OPPO将推出IoT启能行动,开放HeyThings IoT协议、HeyThings IoT服务平
我们正在开发一个在前台服务中运行 MQTT 的应用程序。问题出在小米红米 Note 7 上,在我们终止应用程序后,该服务被终止,但在其他品牌上它工作正常。我没有在 Oppo 和 Vivo 上测试该应用
我创建了一个基本应用程序来检查手机状态更改时是否收到广播,但它不起作用。我也尝试过调用和接听电话。我意识到这些是 Vivo、Honor 等设备的常见问题。这是 list
我已经在我的 Android 应用程序中实现了 FCM 推送通知。我在数据有效负载中获得了所有通知 JSON。而且我在 api 上“未添加”“通知”标签。所以在所有状态(前景/背景/杀死)中,我只收到
我想以编程方式将我的应用程序锁定在 oppo 手机中的最近应用程序中,如图所示,以便我可以在应用程序被终止后在后台运行我的服务。是否可以? 最佳答案 确保应用开启。 转到最近使用的应用(这是您经常按下
在今天的OPPO Find X5系列发布会上,除了手机、平板等产品之外,刘作虎还正式宣布OPPO Air Glass智能眼镜将限量上市,今晚开启预售,将于3月3日正式开售,价格4999元。 据悉,
在 Oppo 设备中,当应用程序从最近的应用程序列表中删除时,OnTaskRemoved () 不会被调用,并且当应用程序在后台且屏幕被锁定时,该服务不会运行。 最佳答案 由于 Oppo 拥有自定义
OPPO Watch系列推出了新一轮的系统版本升级。除了新增一系列APP应用之外,此次更新的亮点主要在于手表回复微信、门禁和公交卡等功能的升级。 这次OPPO Watch系列夏至更新,最重要的
我的 crashlytics 中出现了一个奇怪的 InflateException。这仅发生在 Android 5.1 版本的 Oppo 设备中。从堆栈跟踪可以清楚地看出问题出在 TextView 上
每次我将任何应用程序推送到运行 Android 5.1 (API 22) 的 OPPO R7g 时,它甚至在有机会加载之前就崩溃了。我已经尝试在运行 4.1.2 (API 16) 的 Samsung
我努力阻止这个警告消息,但我仍然没有解决这个问题的方法。 如果有人知道最好的解决方案,请在这里分享。 这些是原因: 这对我的开发来说是烦恼 当我错误触摸它时,它可以被禁用。其实我不想禁用它。我只想像其
在我的 android 应用程序中,定位服务作为后台服务实现。我已经用不同的手机(如三星、micromax、Moto、lenovo、nexus)对其进行了测试,它适用于所有手机。但是当我在 Oppo
我正在尝试检测传入的短信,为此我创建了广播接收器来收听传入的短信。当应用程序位于前台时,它可以完美运行。但是当我从最近的应用程序中关闭应用程序时,然后在 Oppo 和 xiaomi 等手机上,Rece
10 月 12 日消息 OPPO 宣布将于 10 月 19 日在上海举行智美生活新品发布会,根据官方在评论区的说法,此次发布会不止有电视新品,还有其它神秘产品。 上月底 @OPPO 智美生
当我的应用程序处于 Activity 状态时,我在广播接收器上收到网络更改事件,但是一旦我重新启动手机(Oppo 手机 4.4.2 版本),我的应用程序就没有收到任何这些事件 - 网络更改,启动完成。
我是一名优秀的程序员,十分优秀!