안드로이드에서 웹뷰를 연동하여 내 위치를 찾는 데에 성공했습니다!
네이버 지도에서 현재 내 위치를 가져오는데는 성공하였으나
다른 사이트를 시험해보려고 네이버 서비스인 스마트어라운드에 들어가서 내 위치를 확인하려고 했는데 스마트어라운드 사이트가 아에 들어가지지 않습니다.
이것은 혹시 제가 소스를 잘못 짠것일까요? 아니면 어떤 오류인가요?(그 사이트가 아에 들어가지지 않습니다..)
네이버 길찾기로도 내 위치를 따오는데 성공했는데 몇몇 사이트는 내 위치를 가져올 수 가 없습니다. 어떻게하면 좋을까요??
(안드로이드 초보라서 잘 못하나봐요 ㅠㅠ)
혹시 도움이 될까 하여 소스를 첨부합니다.!
MainActivity.java
public class MainActivity extends AppCompatActivity
{
private GpsTracker gpsTracker;
private static final String IS_URL = "https://naver.com";
private static final int GPS_ENABLE_REQUEST_CODE = 2001;
private static final int PERMISSIONS_REQUEST_CODE = 100;
String[] REQUIRED_PERMISSIONS = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
private WebView mwebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mwebView = (WebView) findViewById(R.id.mainweb);
mwebView.getSettings().setJavaScriptEnabled(true);
mwebView.setWebViewClient(new WebViewClient());
mwebView.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt (String origin, GeolocationPermissions.Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
});
mwebView.loadUrl(IS_URL);
if (!checkLocationServicesStatus()) {
showDialogForLocationServiceSetting();
}else {
checkRunTimePermission();
}
// 현재위치 따오기
// final TextView textview_address = (TextView)findViewById(R.id.textview);
//
//
// Button ShowLocationButton = (Button) findViewById(R.id.button);
// ShowLocationButton.setOnClickListener(new View.OnClickListener()
// {
// @Override
// public void onClick(View arg0)
// {
//
// gpsTracker = new GpsTracker(MainActivity.this);
//
// double latitude = gpsTracker.getLatitude();
// double longitude = gpsTracker.getLongitude();
//
// String address = getCurrentAddress(latitude, longitude);
// textview_address.setText(address);
//
// Toast.makeText(MainActivity.this, "현재위치 \n위도 " + latitude + "\n경도 " + longitude, Toast.LENGTH_LONG).show();
// }
// });
}
@Override
public void onRequestPermissionsResult(int permsRequestCode,
@NonNull String[] permissions,
@NonNull int[] grandResults) {
if ( permsRequestCode == PERMISSIONS_REQUEST_CODE && grandResults.length == REQUIRED_PERMISSIONS.length) {
boolean check_result = true;
for (int result : grandResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
check_result = false;
break;
}
}
if ( check_result ) {
;
}
else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[0])
|| ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[1])) {
Toast.makeText(MainActivity.this, "퍼미션이 거부되었습니다. 앱을 다시 실행하여 퍼미션을 허용해주세요.", Toast.LENGTH_LONG).show();
finish();
}else {
Toast.makeText(MainActivity.this, "퍼미션이 거부되었습니다. 설정(앱 정보)에서 퍼미션을 허용해야 합니다. ", Toast.LENGTH_LONG).show();
}
}
}
}
void checkRunTimePermission(){
int hasFineLocationPermission = ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION);
int hasCoarseLocationPermission = ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION);
if (hasFineLocationPermission == PackageManager.PERMISSION_GRANTED &&
hasCoarseLocationPermission == PackageManager.PERMISSION_GRANTED) {
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, REQUIRED_PERMISSIONS[0])) {
Toast.makeText(MainActivity.this, "이 앱을 실행하려면 위치 접근 권한이 필요합니다.", Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(MainActivity.this, REQUIRED_PERMISSIONS,
PERMISSIONS_REQUEST_CODE);
} else {
ActivityCompat.requestPermissions(MainActivity.this, REQUIRED_PERMISSIONS,
PERMISSIONS_REQUEST_CODE);
}
}
}
public String getCurrentAddress( double latitude, double longitude) {
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses;
try {
addresses = geocoder.getFromLocation(
latitude,
longitude,
7);
} catch (IOException ioException) {
//네트워크 문제
Toast.makeText(this, "지오코더 서비스 사용불가", Toast.LENGTH_LONG).show();
return "지오코더 서비스 사용불가";
} catch (IllegalArgumentException illegalArgumentException) {
Toast.makeText(this, "잘못된 GPS 좌표", Toast.LENGTH_LONG).show();
return "잘못된 GPS 좌표";
}
if (addresses == null || addresses.size() == 0) {
Toast.makeText(this, "주소 미발견", Toast.LENGTH_LONG).show();
return "주소 미발견";
}
Address address = addresses.get(0);
return address.getAddressLine(0).toString()+"\n";
}
//GPS 활성화를 위한 메소드들
private void showDialogForLocationServiceSetting() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("위치 서비스 비활성화");
builder.setMessage("앱을 사용하기 위해서는 위치 서비스가 필요합니다.\n"
+ "위치 설정을 수정하실래요?");
builder.setCancelable(true);
builder.setPositiveButton("설정", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
Intent callGPSSettingIntent
= new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(callGPSSettingIntent, GPS_ENABLE_REQUEST_CODE);
}
});
builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
builder.create().show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case GPS_ENABLE_REQUEST_CODE:
//사용자가 GPS 활성 시켰는지 검사
if (checkLocationServicesStatus()) {
if (checkLocationServicesStatus()) {
Log.d("@@@", "onActivityResult : GPS 활성화 되있음");
checkRunTimePermission();
return;
}
}
break;
}
}
public boolean checkLocationServicesStatus() {
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
|| locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
}
해당 소스는 다른 분이 작성하신 소스에 웹뷰를 넣은것입니다.