我是开发 Android 应用程序的新手。我的目标是为我创建的自定义设备创建一个 BLE 应用程序。为了创建 BLE 应用程序,我必须首先学习如何启用位置服务,因为 BLE 需要启用它。
我已阅读并遵循以下说明: https://developer.android.com/training/location/permissions 和 https://developer.android.com/training/permissions/requesting#java
我如何准备我的项目:
创建全新的 Java 项目 Minimum SDK (API 25:Android 7.1.1 (Nougat)
在AndroidManifest中添加权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
implementation "androidx.fragment:fragment:1.5.6"
implementation "androidx.activity:activity:1.7.0"
Full MainActivity.java代码:
package com.example.location_test_v2;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
Log.e("INFO", "PERMISSION ALREADY GRANTED: ");
}
else {
Log.e("INFO", "PERMISSION IS NOT GRANTED: ");
locationPermissionRequest.launch(new String[] {
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_COARSE_LOCATION
});
}
}
private ActivityResultLauncher<String[]> locationPermissionRequest =
registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> {
Boolean fineLocationGranted = result.getOrDefault(android.Manifest.permission.ACCESS_FINE_LOCATION, false);
Boolean coarseLocationGranted = result.getOrDefault(android.Manifest.permission.ACCESS_COARSE_LOCATION,false);
if (fineLocationGranted != null && fineLocationGranted) {
Log.e("INFO", "PRECISE LOCATION GRANTED" );
}
else if (coarseLocationGranted != null && coarseLocationGranted) {
Log.e("INFO", "APPROXIMATAE LOCATION GRANTED" );
}
else {
Log.e("INFO", "NO LOCATION GRANTED" );
}
}
);
}
我已经通过 WiFi 将我的物理设备与 android studio 配对,并在我的 Samsung Flip 4 上模拟应用程序。
想象一个场景,我之前没有在我的手机上安装这个应用程序(假设它是第一次下载),显然这个应用程序还没有位置权限。第一次打开应用程序时,会提示我启用位置共享,如下图所示:
选择精确或大概的位置后,一切似乎都很好。我可以转到我的设置->位置->应用程序权限->Location_test_v2(我的应用程序名称),我可以看到位置权限已授予该应用程序。
我的问题:
我唯一担心的是,如果我手机上的定位服务已关闭,如何才能向该应用程序授予定位权限。为什么我启用或禁用定位服务无关紧要?
为什么我启用或禁用定位服务都没有关系?
位置服务是从 GPS 等向
LocationManager
提供数据的。
但是,位置 权限 不仅涵盖了这一点,还涵盖了可用于确定设备位置的其他技术,例如扫描 WiFi 接入点,或者让您想起您的情况,检测 BLE 信标。