반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
package com.lcw.ex65locationtest;
import android.content.Context;
import android.location.Criteria;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView tvProviders;
TextView tvBestprovider;
LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvProviders= findViewById(R.id.tv_providers);
tvBestprovider= findViewById(R.id.tv_bestprovider);
//위치정보 관리자 객체 소환하기
locationManager= (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//위치정보 제공자(location provider)
//1. gps : 가장 높은 정확도, 무료 , 실내에서 사용 불가, 기상영향 받음, 베터리 소모 많음
//2. network(wifi, 3g, 4g, lte, 5g) : 중간 정도의 정확도, 유료, 어디서나 가능, 베터리 소모 중간
//3. passive : 다른 앱의 마지막 위치정보를 사용. 정확도가 가장 낮음, 베터리 소모 적음, 사용빈도 거의 없음.
//디바이스에서 사용가능한 위치 정보 제공자를 확인
List<String> providers =locationManager.getAllProviders();
String s="";
for(String provide : providers){
s+=provide+", ";
}
tvProviders.setText(s);
//위치정보 제공자 중에서 최고의 제공자 판별 요청
// 최고의 제공자를 판별하기위한 기준(criteria) 객체
Criteria criteria= new Criteria();
criteria.setCostAllowed(true); // 비용지불 감수, LTE써도 된다.
criteria.setAccuracy(Criteria.NO_REQUIREMENT); //정확도를 요하는가?
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);//베터리 소모량
criteria.setAltitudeRequired(true);//고도애 대한 위치 필요한가?
//베스트 위치정보를 얻으려면 퍼미션 필요
String bestProvider=locationManager.getBestProvider(criteria, true);
tvBestprovider.setText(bestProvider);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
실행 시키면
이제 다시 앱을 지우고, 수정하자[동적 퍼미션]
( 퍼미션이 계속 실행되서, 아래 코드는 우리가 사용하는 버젼이 높은 휴대폰에 적용하려면 이렇게 코드 작성해야 한다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
package com.lcw.ex65locationtest;
import androidx.annotation.NonNull;
import android.Manifest;
import android.content.Context;
import android.location.Criteria;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView tvProviders;
TextView tvBestprovider;
LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvProviders= findViewById(R.id.tv_providers);
tvBestprovider= findViewById(R.id.tv_bestprovider);
//위치정보 관리자 객체 소환하기
locationManager= (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//위치정보 제공자(location provider)
//1. gps : 가장 높은 정확도, 무료 , 실내에서 사용 불가, 기상영향 받음, 베터리 소모 많음
//2. network(wifi, 3g, 4g, lte, 5g) : 중간 정도의 정확도, 유료, 어디서나 가능, 베터리 소모 중간
//3. passive : 다른 앱의 마지막 위치정보를 사용. 정확도가 가장 낮음, 베터리 소모 적음, 사용빈도 거의 없음.
//디바이스에서 사용가능한 위치 정보 제공자를 확인
List<String> providers =locationManager.getAllProviders();
String s="";
for(String provide : providers){
s+=provide+", ";
}
tvProviders.setText(s);
//위치정보 제공자 중에서 최고의 제공자 판별 요청
// 최고의 제공자를 판별하기위한 기준(criteria) 객체
Criteria criteria= new Criteria();
criteria.setCostAllowed(true); // 비용지불 감수, LTE써도 된다.
criteria.setAccuracy(Criteria.NO_REQUIREMENT); //정확도를 요하는가?
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);//베터리 소모량
criteria.setAltitudeRequired(true);//고도애 대한 위치 필요한가?
//베스트 위치정보를 얻으려면 퍼미션 필요
String bestProvider=locationManager.getBestProvider(criteria, true);
tvBestprovider.setText(bestProvider);
//마시멜로우(api 23버전)부터 동적 퍼미션 필요 : 앱을 다운도르할 때 뿐만 아니라, 사용할 때도 퍼미션을 체크하는 방식
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
//퍼미션이 허가되어 있지 않은지?
if( checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
//퍼미션을 요청하는 다이얼로그 보이기..
String[] permissions= new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
requestPermissions(permissions,10);//다이얼로그를 보여주는 메소드
}
}
}//onCreate Method..
//requestPermissions()메소드의 호출을 통해
//보여진 다이얼로그의 선택이 종료되면
//자동으로 실행되는 메소드
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 10:
if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "위치정보제공에 동의하셨습니다.", Toast.LENGTH_SHORT).show();
}
break;
}
}
}//MainActivity class..
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
이제 내 위치 얻어오는 코드를 써보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<?xml version="1.0" encoding="utf-8"?>
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_providers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="위치정보 제공자들"/>
<TextView
android:id="@+id/tv_bestprovider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="최고의 위치정보 제공자"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="내 위치 얻어오기"
android:onClick="clickBtn"
android:layout_marginTop="16dp"/>
<TextView
android:id="@+id/tv_mylocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="위도, 경도"
android:padding="8dp"/>
</LinearLayout>
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
package com.lcw.ex65locationtest;
import androidx.annotation.NonNull;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView tvProviders;
TextView tvBestprovider;
TextView tvMylocation;
LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvProviders = findViewById(R.id.tv_providers);
tvBestprovider = findViewById(R.id.tv_bestprovider);
tvMylocation = findViewById(R.id.tv_mylocation);
//위치정보 관리자 객체 소환하기
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//위치정보 제공자(location provider)
//1. gps : 가장 높은 정확도, 무료 , 실내에서 사용 불가, 기상영향 받음, 베터리 소모 많음
//2. network(wifi, 3g, 4g, lte, 5g) : 중간 정도의 정확도, 유료, 어디서나 가능, 베터리 소모 중간
//3. passive : 다른 앱의 마지막 위치정보를 사용. 정확도가 가장 낮음, 베터리 소모 적음, 사용빈도 거의 없음.
//디바이스에서 사용가능한 위치 정보 제공자를 확인
List<String> providers = locationManager.getAllProviders();
String s = "";
for (String provide : providers) {
s += provide + ", ";
}
tvProviders.setText(s);
//위치정보 제공자 중에서 최고의 제공자 판별 요청
// 최고의 제공자를 판별하기위한 기준(criteria) 객체
Criteria criteria = new Criteria();
criteria.setCostAllowed(true); // 비용지불 감수, LTE써도 된다.
criteria.setAccuracy(Criteria.NO_REQUIREMENT); //정확도를 요하는가?
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);//베터리 소모량
criteria.setAltitudeRequired(true);//고도애 대한 위치 필요한가?
//베스트 위치정보를 얻으려면 퍼미션 필요
String bestProvider = locationManager.getBestProvider(criteria, true);
tvBestprovider.setText(bestProvider);
//마시멜로우(api 23버전)부터 동적 퍼미션 필요 : 앱을 다운도르할 때 뿐만 아니라, 사용할 때도 퍼미션을 체크하는 방식
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//퍼미션이 허가되어 있지 않은지?
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//퍼미션을 요청하는 다이얼로그 보이기..
String[] permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
requestPermissions(permissions, 10);//다이얼로그를 보여주는 메소드
}
}
}//onCreate Method..
//requestPermissions()메소드의 호출을 통해
//보여진 다이얼로그의 선택이 종료되면
//자동으로 실행되는 메소드
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 10:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "위치정보제공에 동의하셨습니다.", Toast.LENGTH_SHORT).show();
}
break;
}
}
public void clickBtn(View view) {
//퍼미션 체크.. 안되어 있으면 하지마!!
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
//현재 내 위치 정보 얻어오기
Location location = null;
//매니저를 이용하여 위치정보 얻어오기
if (locationManager.isProviderEnabled("gps")) {
location = locationManager.getLastKnownLocation("gps");
}else if (locationManager.isProviderEnabled("network")){
location = locationManager.getLastKnownLocation("network");
}
if(location==null){
tvMylocation.setText("내 위치 못찾았어");
}else{
//위도, 경도 얻어오기
double latitude=location.getLatitude();
double longitude=location.getLongitude();
tvMylocation.setText(latitude+" , "+longitude);
}
}
}//MainActivity class..
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
이제 실시간 위치도 얻어 보자,]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<?xml version="1.0" encoding="utf-8"?>
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_providers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="위치정보 제공자들"/>
<TextView
android:id="@+id/tv_bestprovider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="최고의 위치정보 제공자"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="내 위치 얻어오기"
android:onClick="clickBtn"
android:layout_marginTop="16dp"/>
<TextView
android:id="@+id/tv_mylocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="위도, 경도"
android:padding="8dp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="내 위치 자동 갱신"
android:onClick="clickBtn2"
android:layout_marginTop="16dp"/>
<TextView
android:id="@+id/tv_automylocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="lat, lng"
android:padding="8dp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="내 위치 자동 갱신 종료"
android:onClick="clickBtn3"/>
</LinearLayout>
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
package com.lcw.ex65locationtest;
import androidx.annotation.NonNull;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TextView tvProviders;
TextView tvBestprovider;
TextView tvMylocation;
TextView tvAutomylocation;
LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvProviders = findViewById(R.id.tv_providers);
tvBestprovider = findViewById(R.id.tv_bestprovider);
tvMylocation = findViewById(R.id.tv_mylocation);
tvAutomylocation= findViewById(R.id.tv_automylocation);
//위치정보 관리자 객체 소환하기
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//위치정보 제공자(location provider)
//1. gps : 가장 높은 정확도, 무료 , 실내에서 사용 불가, 기상영향 받음, 베터리 소모 많음
//2. network(wifi, 3g, 4g, lte, 5g) : 중간 정도의 정확도, 유료, 어디서나 가능, 베터리 소모 중간
//3. passive : 다른 앱의 마지막 위치정보를 사용. 정확도가 가장 낮음, 베터리 소모 적음, 사용빈도 거의 없음.
//디바이스에서 사용가능한 위치 정보 제공자를 확인
List<String> providers = locationManager.getAllProviders();
String s = "";
for (String provide : providers) {
s += provide + ", ";
}
tvProviders.setText(s);
//위치정보 제공자 중에서 최고의 제공자 판별 요청
// 최고의 제공자를 판별하기위한 기준(criteria) 객체
Criteria criteria = new Criteria();
criteria.setCostAllowed(true); // 비용지불 감수, LTE써도 된다.
criteria.setAccuracy(Criteria.NO_REQUIREMENT); //정확도를 요하는가?
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);//베터리 소모량
criteria.setAltitudeRequired(true);//고도애 대한 위치 필요한가?
//베스트 위치정보를 얻으려면 퍼미션 필요
String bestProvider = locationManager.getBestProvider(criteria, true);
tvBestprovider.setText(bestProvider);
//마시멜로우(api 23버전)부터 동적 퍼미션 필요 : 앱을 다운도르할 때 뿐만 아니라, 사용할 때도 퍼미션을 체크하는 방식
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//퍼미션이 허가되어 있지 않은지?
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//퍼미션을 요청하는 다이얼로그 보이기..
String[] permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
requestPermissions(permissions, 10);//다이얼로그를 보여주는 메소드
}
}
}//onCreate Method..
//requestPermissions()메소드의 호출을 통해
//보여진 다이얼로그의 선택이 종료되면
//자동으로 실행되는 메소드
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 10:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "위치정보제공에 동의하셨습니다.", Toast.LENGTH_SHORT).show();
}
break;
}
}
public void clickBtn(View view) {
//퍼미션 체크.. 안되어 있으면 하지마!!
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
//현재 내 위치 정보 얻어오기
Location location = null;
//매니저를 이용하여 위치정보 얻어오기
if (locationManager.isProviderEnabled("gps")) {
location = locationManager.getLastKnownLocation("gps");
}else if (locationManager.isProviderEnabled("network")){
location = locationManager.getLastKnownLocation("network");
}
if(location==null){
tvMylocation.setText("내 위치 못찾았어");
}else{
//위도, 경도 얻어오기
double latitude=location.getLatitude();
double longitude=location.getLongitude();
tvMylocation.setText(latitude+" , "+longitude);
}
}
public void clickBtn2(View view) {
//퍼미션 체크.. 안되어 있으면 하지마!!
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
//내 위치 자동 갱신하도록..
if(locationManager.isProviderEnabled("gps")){
locationManager.requestLocationUpdates("gps",5000,2, locationListener);
}else if(locationManager.isProviderEnabled("network")){
locationManager.requestLocationUpdates("network",5000,2,locationListener);
}
}
public void clickBtn3(View view) {
//퍼미션 체크.. 안되어 있으면 하지마!!
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
//내 위치 자동갱신 제거
locationManager.removeUpdates(locationListener);
}
//위치정보 갱신을 듣는 리스너 멤버 변수
LocationListener locationListener= new LocationListener() {
@Override
public void onLocationChanged(Location location) {
double latitude=location.getLatitude();
double longitude=location.getLongitude();
tvAutomylocation.setText(latitude+", "+longitude);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
}//MainActivity class..
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
특정 위치에 가면 다이얼로그 띄우기.
이러면 특정 위치(코드에 정해놓은)에 가면 다이얼로그가 뜰 것이다.
반응형
'안드로이드 웹앱 콘테츠 개발자 양성(국비지원) > Android 기능' 카테고리의 다른 글
Android Studio(기능) Location / Map 각 사이트 이용 방법 (0) | 2019.10.11 |
---|---|
Android Studio(기능) LBS 3 (지도 앱에 해당 위치 표시하기) (0) | 2019.10.10 |
Android Studio(기능) LBS 2(Location Test) (0) | 2019.10.10 |
Android Studio(기능) Service 2 (Background 작업) 음악재생 (0) | 2019.10.08 |
Android Studio(기능) Service (0) | 2019.10.08 |
댓글