마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 클래스 구현방법에 대해서 질문드립니다..

0 추천

현재 위치의 주소를 읽는 소스입니다..

이걸 처음에는 액티비티 안에 구현을 했는데....

따로 gps.클래스로 만들어서....

반환되는 주소값만 다른 액티비티 등에서 읽어서 사용하고 싶은데요....

방법을 모르겠어요...

다른 액티비티에서 gps.class 자체 호출하는 방법도 모르겠습니다.

힌트 좀 주시면 감사하겠습니다.^^

public class Location_gps extends Activity implements LocationListener
        ,GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    Context mContext;
    private GoogleApiClient mGoogleApiClient;
    private static final long INTERVAL = 1000 *2;
    private static final long FASTEST_INTERVAL = 1000 *5;
    private LocationRequest mLocationRequest;
    Location mCurrentLocation;
    private static final int REQUEST_CODE_LOCATION = 2;
    public String place;
    public String detailjuso;
    GoogleApiClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);

        chkGpsService();
        createLocationRequest();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                //.enableAutoManage(Location_gps.this, 0, this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        updateUI();
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }

    protected void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(INTERVAL);
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    private void updateUI() {
        Log.d("NOTICE", "UI update initiated .............");
        if (null != mCurrentLocation) {
            //Toast.makeText(MainActivity.this, "~~~~~~~~~", Toast.LENGTH_SHORT).show();
            String lat = String.valueOf(mCurrentLocation.getLatitude());
            String lng = String.valueOf(mCurrentLocation.getLongitude());

          Toast.LENGTH_SHORT).show();
            new GetAddressTask().execute(mCurrentLocation);
        } else {
            //Toast.makeText(MainActivity.this, "location null", Toast.LENGTH_SHORT).show();
            Log.d("NOTICE", "location is null ...............");
        }
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        startLocationUpdates();
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
        updateUI();
    }

    public class GetAddressTask extends AsyncTask<Location, Void, String>
    {
        @Override
        protected String doInBackground(Location... params) {
            // TODO Auto-generated method stub
            Geocoder geocoder = new Geocoder(Location_gps.this);
            Location location = params[0];

            //String addrStr = null;
            List<Address> addresses = null;

            try {
                addresses = (List<Address>)geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 5);
                Address addr = addresses.get(0);
                detailjuso = addr.getLocality()+ " "+ addr.getThoroughfare();
                //detailjuso = addr.getAddressLine(0);
                //addrStr = addr.getAddressLine(0) + ", "+addr.getAdminArea() + ", "+addr.getCountryCode();
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("KSJ", "Service Not Available..");
            }

            if (addresses != null && addresses.size() > 0) {
                return detailjuso;
            }

            return null;
        }

        protected void onPostExecute(String result) {

            place = result;

            //t1.t1where.setText(place);
            Toast.makeText(Location_gps.this, "Current Location : " + place, Toast.LENGTH_SHORT).show();
            //juso.setText(result);
            //t1where.setText(detailjuso);
        }
    }

    protected void startLocationUpdates() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                    || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            } else {
                ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_LOCATION);
            }
        } else {
            PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_CODE_LOCATION) {
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // success!
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                            || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                        PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
                    }
                }
            } else {
                // Permission was denied or request was cancelled
            }
        }
    }

    protected void stopLocationUpdates() {
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        Log.d("NOTICE", "Location update stopped .......................");
        Toast.makeText(Location_gps.this, "Current Location STOP...!! ", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
        Log.e("KSJ", "mGoogleApiClient.connect() 연결되었습니다..^^");
    }

    @Override
    public void onStop() {
        super.onStop();
        mGoogleApiClient.disconnect();
        Log.e("KSJ", "mGoogleApiClient.connect() 해제되었습니다..^^");
    }
}

 

 

앤드류이드 (6,190 포인트) 님이 2016년 9월 2일 질문
Gps를 핸들링하는 클래스에서 새로운 로케이션이 도착했을 때 해당 액티비티로 결과값을 전달해 줄 수 있록 콜백이나 옵저버 패턴을 사용하시면 됩니다. 제가 모발이라 참고할 수 있는 샘플 코드는 작성할 수가 없네요. 구글링을 해보시죠. AsyncTask에 콜백인터페이스를 사용하는 것과 동일한 패턴입니다.
대충 흐름만 참조하시라고 샘플로 코드를 만들어 봤습니다.  그냥 어떤 식으로 콜백을 주입하고 호출하고 하는 개념만 이해하셔서 코드에 적용하시기 바랍니다.

public class LocationTracker implements
            ,GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
 

    private GPSLocationListener listener;

    public LocationGps(GPSLocationListener listener) {
        createLocationRequest();
        this.listener = listener;
    }
 
    public void setConnectionCallback(GPSLocationListener listener) {
        this.listener = listener;
    }
 
    @Override
    public void onConnected(@Nullable Bundle bundle) {
        startLocationUpdates();
    }
 
    @Override
    public void onConnectionSuspended(int i) {
 
    }
 
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
 
    }
 
    @Override
    public void onLocationChanged(Location location) {
        if (this.listener != null)
            this.listener.onLocationChanged(location);
    }

    public void createLocationRequest() {

    }

    public static inteface GPSLocationListener {
        //public void onConnected(@Nullable Bundle bundle);
        public void onConnectionSuspended(int i);
        public void onConnectionFailed(ConnectionResult connectionResult);
        public void onLocationChanged(Location location);
    }
}

public class LocationActivity extends Activity  {

    LocationTracker mTracker;

    GPSLocationListener locationListener = new GPSLocationListener() {
        //Method implementation

        @Override
        public void onLocationChanged(Location location) {
            updateUi();
        }
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        mTracker = new GpsTracker();
    }
    
    private void updateUi(){

    }
}

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...