웹 api중 geolocation api가 있습니다.
http에서는 사용이 불가능하고
https에서만 사용이 가능합니다.
따라서 테스트 할때도 ngrok으로 세팅을 하는등 별도의 툴을 이용해야 합니다.
ngrok으로 로컬서버를 개방 하는법은 따로 포스팅 할 수 있도록 할게요
아래 첨부 링크는 웹에서 geolocation 에 관한 링크 입니다
https://developer.mozilla.org/ko/docs/Web/API/Geolocation_API/Using_the_Geolocation_API
웹뷰에서 사용하려면 앱 에서 위치사용 권한을 승인해 주어야 합니다.
먼저 AndroidManifest.xml에 위치 권한을 추가해줍니다
// AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
onCreate될때 권한 승인을 바로 요청하는 함수 입니다.
이렇게 되면 위치 권한 사용 승인을 하지 않으면 앱은 실행되지 않고 계속 킬때마다 요청하게 됩니다.
서비스에 따라 사용여부가 갈릴것 같군요
@Override
protectd void onCreate(Bundle savedInstanceState) {
...
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
...
}
아래 코드를 추가해서 웹뷰에서 승낙 혹은 거절시에 알맞은 동작을 커스텀 할수 있습니다
@Override
protected void onCreate(Bundle savedInstanceState) {
//....
webSettings.setGeolocationEnabled(true);
//....
//....
WebChromeClient webClient = new WebChromeClient() {
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
}
//....
}
invoke() 내부 파라미터중 allow는 권한 승낙, retain은 유지를 의미합니다.
onRequestPermissionResult는 권한 요청에 따라 결과 처리를 하는 부분입니다. 권한 설정을 하기로 눌렀으면 intent를 실행해 권한을 설정할수 있도록 이동시켜 줍니다. 여기서도 서비스에 따라 커스텀 해주면 될것 같군요
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if (grantResults.length > 0) {
for (int i=0; i<grantResults.length; ++i) {
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
new AlertDialog.Builder(this).setTitle("알림").setMessage("권한을 허용해주셔야 앱을 이용할 수 있습니다.")
.setPositiveButton("종료", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
}).setNegativeButton("권한 설정", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
getApplicationContext().startActivity(intent);
}
}).setCancelable(false).show();
return;
}
}
}
}
}
'네이티브 > Android' 카테고리의 다른 글
Android Uri.getQueryParameter에 + 들어가면 빈칸으로 바뀝니다. (0) | 2022.01.12 |
---|---|
Android build.gradle 주요 정보 보안 (0) | 2021.12.05 |
Android 화면 Resizing with windowSoftInputMode (0) | 2021.11.29 |
Android preload 띄우기 (0) | 2021.09.28 |
Android 스플래쉬 화면 띄우기 (0) | 2021.09.27 |