小编dav*_*ung的帖子

Android 11 用户无法授予后台位置权限?

从 Android 11 开始,面向 SDK 30+ 的应用不会向用户显示多次向应用授予后台位置权限的选项。如果最初未授予,则需要用户转到设置页面。 我们如何将用户带到正确的设置页面?

当您的应用中的某项功能在运行 Android 11 或更高版本的设备上请求后台位置时,系统对话框不包含用于启用后台位置访问的按钮。为了启用后台位置访问,用户必须在设置页面上为您的应用程序的位置权限设置始终允许选项,如有关如何请求后台位置的指南中所述。

https://developer.android.com/about/versions/11/privacy/location#change-details

授予后台位置的设置选项的用户可见标签(例如,图 3 中的始终允许)。您可以调用getBackgroundPermissionOptionLabel() 来获取此标签。此方法的返回值已本地化为用户的设备语言首选项。

https://developer.android.com/training/location/permissions#request-location-access-runtime

虽然 Android 提供了一个新的 API 来获取此设置页面标签,但没有记录的 API 可以直接调出此设置页面。您最接近的是调出特定于应用程序的设置页面,如下所述。从那里,用户必须至少执行两次点击才能深入到“权限”->“位置”以启用后台访问。这是一个繁重的过程,许多用户将无法完成。

在这个问题中已经记录了很长时间没有打开设置页面的 API,但在 Android 11 发布时更为重要,因为没有其他方式授予后台权限。

如何以编程方式打开 Android Marshmallow 上特定应用程序的权限屏幕?

它能够使用户以正确的设置页面中的第一次用户使用这样的代码问: requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), PERMISSION_REQUEST_BACKGROUND_LOCATION)。这只会工作一次。如果用户拒绝该权限(或什至意外回击或未授权就离开屏幕),这将永远不会再起作用,并且用户必须如上所述手动向下钻取设置。

除了指示他们在“设置”中寻找正确的页面之外,应用程序是否真的没有办法在初始拒绝后帮助用户授予后台位置权限?

我错过了什么吗?如果没有,这不是 Android 11 的主要可用性问题吗?

在第一次提示中触发正确设置页面所需的完整代码示例,但无法再次执行此操作:

        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            if (checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
                != PackageManager.PERMISSION_GRANTED
            ) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
                    val builder =
                        AlertDialog.Builder(this)
                    builder.setTitle("This app needs background location access")
                    builder.setMessage("Please grant location access so this app can detect beacons in the …
Run Code Online (Sandbox Code Playgroud)

android location android-permissions android-geofence beacon

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

蓝牙LE扫描在后台无法在Android M上运行

以下代码适用于运行Android 5.1.1(Build LMY48M)的Nexus 9,但不适用于运行Android 6.0的Nexus 9(Build MPA44l)

List<ScanFilter> filters = new ArrayList<ScanFilter>();
ScanSettings settings = (new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)).build();
ScanFilter.Builder builder = new ScanFilter.Builder();
builder.setManufacturerData((int) 0x0118, new byte[]{(byte) 0xbe, (byte) 0xac}, new byte[]{(byte) 0xff, (byte)0xff});
ScanFilter scanFilter = builder.build();
filters.add(scanFilter);
mBluetoothLeScanner.startScan(filters, settings, new ScanCallback() {
  ...
});
Run Code Online (Sandbox Code Playgroud)

在Android 5.x上,当看到与扫描过滤器匹配的制造商广告时,上述代码产生回调.(参见下面的示例Logcat输出.)在带有MPA44l的Nexus 9上,没有收到回调.如果您注释掉扫描过滤器,则会在Nexus 9上成功接收回调.

09-22 00:07:28.050    1748-1796/org.altbeacon.beaconreference D/BluetoothLeScanner? onScanResult() - ScanResult{mDevice=00:07:80:03:89:8C, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=null, mManufacturerSpecificData={280=[-66, -84, 47, 35, 68, 84, -49, 109, 74, 15, -83, -14, -12, -111, 27, -87, -1, -90, 0, 1, 0, …
Run Code Online (Sandbox Code Playgroud)

android bluetooth-lowenergy android-bluetooth android-6.0-marshmallow

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

BluetoothLeAdvertiser可以在Android 5.0的Nexus 5上运行吗?

将我的Nexus 5闪存到Android 5.0预览版本hammerhead-lpx13d后,操作系统报告它不再支持蓝牙LE广告.如果你打电话:

((BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE))
    .getAdapter().getBluetoothLeAdvertiser()
Run Code Online (Sandbox Code Playgroud)

始终返回null.另外,新方法:

((BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE))
    .getAdapter().isMultipleAdvertisementSupported()
Run Code Online (Sandbox Code Playgroud)

总是返回false

第一种用于在6月份返回Nexus 5的第一个Android L预览版本上的有效对象的方法.闪烁最新更新后,它不再这样做了.

有人看到了吗?

编辑:至少有一个人在此处复制了此问题,他在此处向Google提出了一个问题:https://code.google.com/p/android-developer-preview/issues/detail?id = 1570

android bluetooth-lowenergy ibeacon ibeacon-android

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

使三星Android设备作为iBeacon做广告

有没有人使用三星的蓝牙LE API让三星Android设备作为iBeacon做广告?这应该是可能的,但我无法访问设备来尝试它.

如果有人用它来制作三星Android设备作为任何其他蓝牙LE外设做广告,我也想知道.

编辑:现在可以在Android L上使用.请看这里.

android samsung-mobile bluetooth-lowenergy ibeacon

7
推荐指数
2
解决办法
5414
查看次数

通过将应用程序放入/ system/app获取Android系统权限?

尝试使用AOSP的一些较新的Android API,我发现一些需要android.permission.BLUETOOTH_PRIVILEGED权限.根据文档,许可"不适用于第三方应用程序".

我在别处读过,你可以通过在/ system/app目录中安装你的应用程序来获得root设备的系统级权限.我在我的root用户Nexus 5上尝试了这个,但是我的应用程序仍然无法获得所需的权限.(参见下面的代码和LogCat输出.)

我听说过的另一种方法是构建自己的自定义Android ROM,然后使用相同的密钥对应用程序进行签名.我可以做到这一点,但如果可能的话,我强烈希望能够使用股票图像.

那是哪个呢?是否可以在带有库存图像的root电话上获得系统级权限?如果是这样,我做错了什么?

活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if ((this.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
        Log.d(TAG, "This is a system application");
    }
    else {
        Log.d(TAG, "This is not a system application");         
    }
    if (getApplicationContext().checkCallingOrSelfPermission("android.permission.BLUETOOTH_PRIVILEGED") == PackageManager.PERMISSION_GRANTED) {
        Log.d(TAG, "I have android.permission.BLUETOOTH_PRIVILEGED");
    }
    else {
        Log.d(TAG, "I do not have android.permission.BLUETOOTH_PRIVILEGED");            
    }       
    ...     

}
Run Code Online (Sandbox Code Playgroud)

LogCat输出:

W/PackageManager(  788): Not granting permission android.permission.BLUETOOTH_PRIVILEGED to package com.radiusnetworks.testapp (protectionLevel=18 flags=0x8be47)
I/ActivityManager(  788): Start proc …
Run Code Online (Sandbox Code Playgroud)

permissions android android-permissions

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

Estimote和Gimbal beacon的正确BeaconLayout是什么?

我希望Android Beacon Library的2.0版本能够正确检测旧式Estimote信标(不支持iBeacon技术的2013年之前的型号)和Gimbal信标.我知道万向节信标有加密的标识符,因此无法直接读取.但我至少想分享可以检测出一个存在的代码.

这是我有的:

用于检测万向节信标的代码(不读取加密标识符):

BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
BeaconManager.getBeaconParsers().add(new BeaconParser().
       setBeaconLayout("m:0-3=ad7700c6"));
beaconManager.bind(this);
Run Code Online (Sandbox Code Playgroud)

用于检测2013年中期Estimote信标的代码(不读取标识符,因为我不知道如何):

BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
BeaconManager.getBeaconParsers().add(new BeaconParser().
       setBeaconLayout(""m:0-3=2d24bf16""));
beaconManager.bind(this);
Run Code Online (Sandbox Code Playgroud)

是否有任何人(特别是来自Estimote或Gimbal的人)有关于上述字节偏移的任何附加信息,这将允许尽可能多地从传输中解码信息?在每种情况下,我认为我们需要关闭蓝牙服务UUID,它可能用比上面例子中更多的字节正确表示.我很想知道完整的服务UUID以及广告中发送的任何其他可读字段.

android ibeacon-android altbeacon

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

iBeacon后台扫描

我写了自己的小BLE扫描服务,每隔3-5秒通过一次警报触发.它扫描1.1秒以获得它周围的信标,然后将RSSI信号转换为粗略接近.

我现在正在考虑Radius Networks Android iBeacon服务,但我想知道如何实现相同的后台扫描.

例如:我希望信标scannign在后台启动并运行,并将Intent接收到广播接收器,以决定我对扫描的信标做了什么.

有没有例子,估计这消耗了多少电池?

android ibeacon ibeacon-android

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

在XCode中禁用UITests

我的UITests在XCode的测试窗格中突然变得灰暗.(见下图.)因此,当我选择产品 - >测试时,它们不会运行.只有单元测试运行(不显示灰色).

尽管它们是灰色的,但我可以按住UITests中的每个行项目并成功运行它.

知道什么配置导致这个灰显了吗?我该怎么扭转呢?

在此输入图像描述

xcode ios xcode-ui-testing uitest

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

以编程方式解锁 Windows 10

我正在构建一个应用程序,以根据与移动应用程序的接近程度自动解锁/锁定工作站。该解决方案类似于此处描述的 Microsoft 应用程序,因此我很确定这是可能的。

我可以使用什么 API 以编程方式解锁 Windows 10 工作站? 我在这里看到了一个类似的问题,但它已经有六年历史了,我不知道它描述的技术是否对 Windows 10 甚至有效。

因为这个应用程序将依赖蓝牙 LE,它需要 Windows 10+,所以我不需要支持旧操作系统版本的解决方案。

我是一名经验丰富的程序员,但 10 年来没有做过任何 Windows 编程,所以我不知道去哪里找。任何帮助表示赞赏。

c# winapi windows-security windows-10

5
推荐指数
0
解决办法
1384
查看次数

背景地理围栏真的适用于 Android 8+ 吗?

我有一个地理围栏应用程序,我正在尝试移植它以在 Android 8+ 上工作。我已阅读有关该主题的教程,并切换到使用compile 'com.google.android.gms:play-services-location:16.0.0'.

当应用程序不在前台时,地理围栏输入事件永远不会触发。 我等了超过文档说可能需要的两分钟。我已经等了 15 分钟,但没有结果。只要我将应用程序带到地理围栏内的前台,它就会立即触发。

我知道在 Android 8+ 上对后台服务有限制,但 Google 的教程说使用 IntentService 应该在 Android 8+ 上被阻止。 事后编辑:上述教程是完全错误的。不要跟着它。IntentService 将不起作用。

我尝试按照这个答案,它说使用新的GeofencingClient来设置你的意图来解决这个问题。(我不明白为什么这会有所帮助,因为它仍然使用 IntentService 来接收事件,并且在我的代码中不起作用。)

This answer to a related question here表明您必须使用BroadcastReceiver而不是IntentService,但我不明白为什么这会有所作为,因为Android 8在后台对BroadcastReceiver施加了与IntentServices相同的限制。 事后编辑:这个链接的答案也是正确的。虽然隐式广播接收器受到限制,但在运行时注册以将请求发送到特定包的显式广播接收器不受限制并且可以正常工作。

是否真的有可能在 Android 8+ 上获得在后台唤醒您的应用程序的地理围栏回调?如果是这样,你怎么能做到这一点?

我的地理围栏设置:

googleApiClient = new GoogleApiClient.Builder(this.context)
        .addApi(LocationServices.API)
        .addConnectionCallbacks(getServiceSetup())
        .addOnConnectionFailedListener(getServiceFailureStrategy())
        .build();
geofencingClient = LocationServices.getGeofencingClient(context);

Intent intent =  new Intent(context, mIntentService);
// We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
// …
Run Code Online (Sandbox Code Playgroud)

android location geofencing android-geofence android-8.0-oreo

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