git을 사용하면 commit이라는 용어가 SVN을 사용하던 사람들에게는 좀 혼동이 있을 수 있습니다.

commit이 서버 저장소에 저장을 하는게 아니기 때문인데요.

git는 로컬에서 add, commit을 사용하고 서버에는 push를 사용합니다.

git는 로컬에 staging area라는 중간 단계를 두고 있어서 여기에 저장하는걸 commit이라고 합니다.

내가 작업하고 있는 위치는 working directory (여기서 add, commit으로 staging에 등록)

내 컴퓨터의 git가 관리하는 위치는 staging area (여기서 pushrepository에 저장)

원격 servergithub가 관리하는 위치는 repository.


android github upload

 

이 글을 읽는다면 처음 사용하시는 분들일것 같아 잠시 설명좀 했습니다.

 

순서는 다음과 같습니다.

1. Git 환경 설정

2. Staging Area 작업

2.1 repository 생성

2.2 Add

2.3 GitHub Repository 생성

3. Commit and Push

 

 

1. Git 환경 설정

 

github에 프로젝트를 올리는 작업을 하려면 선행 조건이 있습니다.

로컬 컴퓨터에 git이 설치 되고 path가 설정되어 있어야 합니다.

github에 회원가입이 되어 있어야 합니다.

android studiogit가 설정되어 있어야 합니다.

 

설정되어 있지 않다면 미리 다음 페이지를 검토 하세요.

[GitHub] GitHub 회원 가입하기

 

[Git] Git 설치 하기 (Windows 용 - Git-2.20.1-64-bit)

 

[Git] Git 무설치 버전 windows 설치 하기

 

[안드로이드] Android studio에 github 환경 설정 하기

 


2. Staging Area 작업

 

2.1 repository 생성


로컬 gitrepository를 생성하는 작업을 진행 합니다.

 

프로젝트를 하나 생성하거나 기존 프로젝트를 오픈 합니다.

메뉴에서

VCS > Import into Version Control > Create Git Repository...

를 선택 합니다.



GItRepository를 생성할 프로젝트를 선택 합니다.



현재 작업중인 프로젝트를 선택 하고 [OK] 버튼을 클릭 합니다.

 

자세히 안보면 모르고 지나갈 수 있는데

프로젝트 선택 전 파일 모습입니다.

 


선택 후 파일 색이 변경 되었습니다.




Repository만 생성 했지 파일을 올리지 않아서 알려주는 것입니다.

 

2.2 Add


staging area에 목록을 올리는 작업입니다.

안드로이드 스튜디오 좌측 상단을 보면 기본값이 [Android]로 선택되어 있습니다.

이걸 클릭 해서 Project 를 선택 합니다.



그러면 현재 열려 있는 프로젝트명이 나오는데 여기에 마우스를 대고

마우스의 오른쪽 버튼을 눌러줍니다.



Project > Git > Add

이런 순서로 선택하면 붉은색 파일명이 녹색으로 변경 됩니다.



2.3 GitHub Repository 생성

 

이제 GitHub 서버에 연동해서 Repository를 생성 시켜보겠습니다.

 

상단 메뉴에서

VCS > import into Version Control > Share Project on Github

를 선택해 줍니다.



원격 GitHub 서버와 공유할 프로젝트를 설정하는 창입니다.



연동할 파일 목록과 간략한 내용을 입력해 줍니다.

SharedPrefGitHubRepository에 생성될 이름 입니다.



[OK]버튼을 클릭 합니다.

이제 연동이 되었습니다.


그러나 파일까지 업로드 된건 아닙니다. 프로젝트 명칭만 생성되것 입니다.

github 페이지에 들어가 보면 repository가 생성된걸 확인 할 수 있습니다.


최초에 android만 존재 했는데



새로운 Repository가 추가 되었습니다.



 

3. Commit and Push

 

stagingcommit 하고 github에 실제 파일을 push 해보겠습니다.

메뉴에서

VCS > Commit

을 선택 합니다.



또는 상단 툴바에서



이걸 클릭 해도 됩니다.

 

커밋할 파일들이 보입니다.



[Commit and Push] 버튼을 클릭 합니다.



왜 커밋하는지 이유를 써달라는 군요.

소스 변경 부분이 있을 경우 적어두면 나중에 디버깅 또는 원복이 쉽게 됩니다.



idemail을 기입하고 commit 합니다.




2개의 경고가 있다고 합니다.

대충 만든걸 아는군요.



경고쯤은 그냥 무시하고 [commit and push]를 누릅니다.



이제 실제 github에 올립니다.

[Push] 버튼을 클릭합니다.

 

github에 들어가서 확인을 해봅니다.



이제 파일들까지 잘 올라갔습니다.

- copy coding -


github에 공개되어 있는 프로젝트를 안드로이드 스튜디오에 가져와서 사용하는

방법에 대하여 테스트 해보겠습니다.

 

가장 깔끔한 방법은 git를 설치 하고,

github에 회원가입 하고,

android studiogit 설정을 완료한

상태에서 진행을 하는 것 입니다.

 

여기서는 위의 설정이 되어있지 않은 경우 어떻게 해야 하는지에 대해 설명 합니다.

물론 중간 중간 작업이 중단되기는 하지만 미완료 되는것은 아닙니다.

중단될 때마다 작업을 하여 다음 단계로 진행 되고 결국은 끝까지 도달 합니다.

 

왜 이걸 하는가?

중간에 오류가 발생해도 원하는 답을 주면 무리 없이 완료할 수 있습니다.

 

모든 설정이 완료된 상태에서 진행을 한다면 아래에 있는 불필요한 단계들을 건너뛸 수 있습니다.

 

1. Git 설치

2. 안드로이드 스튜디오 git 설정

3. 프로젝트 다운로드

순서로 설명 합니다.

 


1. Git 설치

 

Git를 다운받아 설치 합니다.

일반 설치 관련 설명은

[Git] Git 설치 하기 (Windows 용 - Git-2.20.1-64-bit)


무설치 버전 설명은

[Git] Git 무설치 버전 windows 설치 하기

참고하여 설치 합니다.

 

여기서는 무설치 버전을 압축만 푼경우로 진행 합니다.

 


2. 안드로이드 스튜디오 git 설정


안드로이드 스튜디오를 실행합니다.

[Check out project from Version Contrl]을 클릭하고

Git를 선택해줍니다.



URLDirectory를 입력하는 창이 나타납니다.



 

URLgithub의 저장소 주소이고

Directory는 로컬 컴퓨터(내가 저장할 장소)의 디렉토리를 설정하는 창입니다.

 

URL은 공유되어 있는 github 사이트에 가면 얻을 수 있습니다.

Checkout 받으려는 git 사이트에 접속합니다.



사이트 우측에 [Clone or download]를 클릭하면 하단에 다운로드를 받을 수 있도록 되어있는데

여기서 주소(URL) 오른쪽 아이콘을 클릭하면 클립보드에 자동으로 주소가 복사 됩니다.

그럼 다시 안드로이드 스튜디오로 와서 Ctrl+V 하면 되겠죠?



복사를 하면 .git 확장자의 주소가 입력됩니다.

Directory C:\android로 신규 생성한 위치로 잡았습니다.

좌측 하단에 [Log in to GitHub]라고 버튼이 있습니다.

Git에 로그인이 되지 않아서입니다.

git에 회원가입이 안되어있으면 계정을 만드셔야 합니다.

[Log in to GitHub] 버튼을 선택해서 로그인을 진행합니다.



Auth Type:Password로 변경하고 로그인을 진행 합니다.

로그인이 성공하면 로그인 버튼이 사라집니다.

[Test] 버튼을 선택 합니다.



연결 성공입니다.

그럼 [Clone] 버튼을 선택 합니다.



이런, 오류가 발생하는 군요.

git가 설치버전이 아니라 못찾겠다는군요.

위치가 어딘지 잡아줘야겠죠.

git 실행파일 위치를 찾아 봅니다.



요기 있군요.



PathC:\git\cmd를 추가해 줍니다.

 

안드로이드 스튜디오를 종료하고 다시시작 해야 합니다.

[Test] 버튼을 클릭 합니다.



. 성공했다네요.

좌측에 로그인 하라는 버튼도 사라졌습니다.

 

3. 프로젝트 다운로드

 

[Clone] 버튼을 선택해서 로컬에 다운로드 받습니다.

프로젝트를 생성하겠냐고 물어봅니다.



[Yes]지요.

프로젝트 Import 설정입니다.



먼저 Create project from existing sources 선택한 경우 입니다.

소스를 미리 가지고 있는 경우입니다.

소스 위치를 잡아줍니다.



디렉토리가 없으면 신규 디렉토리를 생성해서 설치한다는 군요.

소스가 있는경우랬는데 좀 이상합니다.



주석을 써달라고 하는데



할말이 없어서 그냥 [Next] 버튼 클릭

. No frameworks detected. 라는군요.

소스가 없으면 위에서 오류처리하지.



그럼 처음으로 다시 돌아가서

이번에는 두번째 라디오버튼을 클릭한 경우입니다.

Import project from external model 라디오버튼을 선택 합니다.



외부에서 프로젝트를 import 시키라고 하고

[Finish] 버튼을 클릭 합니다.

바로 소스를 다운받고 있습니다.



한참 소스를 다운받고



. 다받았습니다.

종료입니다.

 

git를 안드로이드 스튜디오에 미리 설정해 주면 이런 복잡함은 사라집니다.

 

아래 링크를 참고해서 미리 설정하고 사용하세요.

 

[안드로이드] Android studio github 환경 설정 하기


- copy coding -


위치 이동이 없는 경우 걸음 횟수를 계산하지 않는 방법을 질문하여 간단하게 테스트를 하여보았습니다.

기존에 올린 글 두개를 섞어서 만들어 보았습니다.


안드로이드 핸드폰 걸음 감지 센서 작동 테스트 (TYPE_STEP_DETECTOR)

안드로이드 GPS 이용한 속도 측정


소스는 간단 설명하면

1. 걸음 센서 작동 감지

2. 마지막 위치와 현재 위치 사이의 거리 계산

3. 일정 부분 움직인 경우만 걸음 수 계산

이렇게 됩니다.

 

조금씩 테스트 하면서 거리 값을 수정해야 할 것 같고 필요하면 시간도 포함을 하면 조금 좋은 걸음 수 계산을 할 수 있을 것 같습니다.


1. 걸음 센서 작동 감지 / 3. 걸음 수 계산


TYPE_STEP_DETECTOR가 감지되면 getGPSLocation() 함수를 호출 합니다.

if(longWork > 0.05) 테스트를 위해 거리 이동 감지를 0.05m로 했습니다.

0.05m 이상 이동하면 카운트를 하겠죠

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
        if(event.values[0] == 1.0f) {
            double longWork = getGPSLocation();
            if(longWork > 0.05) {
                mStepDetector++;
                tvStepDetector.setText("Step Detect : " + String.valueOf(mStepDetector));
                tvTimeDif.setText("Return 간격 : " + String.format("%.3f",longWork) + " m");  // Time Difference
            }
        }
    }
}


2. 마지막 위치와 현재 위치 사이의 거리 계산


최종 위치와 현재 위치를 이용하여 거리를 계산 합니다.

deltaDist = distance(lat1,  lng1,  lat2,  lng2);

 


4. 프로그램 소스

 

4.1 결과

 

걸음 감지가 되기 전에는 거리 계산을 하지 않아 모든 값이 공백입니다.

걸음이 감지 되면 기존 위치와 현재 위치를 이용하여 거리를 계산합니다.


step detector gps provider


핸드폰에서 직접 좌표이용 만보계를 테스트 해보세요.


StepLocation.apk




4.2 AndroidManifest.xml


위치 정보를 사용하기 위한 퍼미션 정보를 설정 합니다.


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="copycoding.tistory.steplocation">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


4.3 activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Step Detector Sensor"
        android:layout_marginTop="50dp"
        android:textSize="30dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tvGpsEnable"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="GPS Enable :"
        app:layout_constraintTop_toBottomOf="@+id/tvTitle"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="25dp"
        />

    <TextView
        android:id="@+id/tvStepDetector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Step Detect : 0"
        app:layout_constraintTop_toBottomOf="@+id/tvGpsEnable"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="25dp"
        />

    <TextView
        android:id="@+id/tvGpsLatitude"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Latitude : "
        app:layout_constraintTop_toBottomOf="@+id/tvStepDetector"
        android:textSize="20dp"
        />
    <TextView
        android:id="@+id/tvGpsLongitude"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Longitude : "
        app:layout_constraintTop_toBottomOf="@+id/tvGpsLatitude"
        android:textSize="20dp"
        />
    <TextView
        android:id="@+id/tvEndLatitude"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="End Latitude : "
        app:layout_constraintTop_toBottomOf="@+id/tvGpsLongitude"
        android:textSize="20dp"
        />
    <TextView
        android:id="@+id/tvEndLongitude"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="End Longitude : "
        app:layout_constraintTop_toBottomOf="@+id/tvEndLatitude"
        android:textSize="20dp"
        />
    <TextView
        android:id="@+id/tvTimeDif"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="시간 간격 :"
        app:layout_constraintTop_toBottomOf="@+id/tvEndLongitude"
        android:textSize="25dp"
        />
    <TextView
        android:id="@+id/tvDistDif"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="거리 간격 :"
        app:layout_constraintTop_toBottomOf="@+id/tvTimeDif"
        android:textSize="25dp"
        />
    <TextView
        android:id="@+id/tvNowLatitude"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Now Latitude : "
        app:layout_constraintTop_toBottomOf="@+id/tvDistDif"
        android:textSize="20dp"
        />
    <TextView
        android:id="@+id/tvNowLongitude"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Now Longitude : "
        app:layout_constraintTop_toBottomOf="@+id/tvNowLatitude"
        android:textSize="20dp"
        />

</android.support.constraint.ConstraintLayout>


4.4 MainActivity.java


package copycoding.tistory.steplocation;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements SensorEventListener, LocationListener {

    private SensorManager sensorManager;
    private Sensor stepDetectorSensor;
    TextView tvStepDetector, tvGpsEnable, tvGpsLatitude, tvGpsLongitude, tvTimeDif, tvDistDif, tvEndLatitude, tvEndLongitude, tvNowLatitude, tvNowLongitude;
    private int mStepDetector = 0;
    private boolean isGPSEnable = false;

    private LocationManager locationManager;
    private Location lastKnownLocation = null;
    private Location nowLastlocation = null;

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

        //location -------
        tvGpsEnable = (TextView)findViewById(R.id.tvGpsEnable);
        tvGpsLatitude = (TextView)findViewById(R.id.tvGpsLatitude);
        tvGpsLongitude = (TextView)findViewById(R.id.tvGpsLongitude);
        tvEndLatitude = (TextView)findViewById(R.id.tvEndLatitude);
        tvEndLongitude = (TextView)findViewById(R.id.tvEndLongitude);
        tvNowLatitude = (TextView)findViewById(R.id.tvNowLatitude);
        tvNowLongitude = (TextView)findViewById(R.id.tvNowLongitude);
        tvTimeDif = (TextView)findViewById(R.id.tvTimeDif);
        tvDistDif = (TextView)findViewById(R.id.tvDistDif);
        //권한 체크
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
//        lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        // GPS 사용 가능 여부 확인
        isGPSEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        tvGpsEnable.setText("GPS Enable: " + isGPSEnable);  //GPS Enable
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

        //step -----
        tvStepDetector = (TextView)findViewById(R.id.tvStepDetector);
        sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        stepDetectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
        if(stepDetectorSensor == null) {
            Toast.makeText(this, "No Step Detect Sensor", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
            if(event.values[0] == 1.0f) {
                double longWork = getGPSLocation();
                if(longWork > 0.05) {
                    mStepDetector++;
                    tvStepDetector.setText("Step Detect : " + String.valueOf(mStepDetector));
                    tvTimeDif.setText("Return 간격 : " + String.format("%.3f",longWork) + " m");  // Time Difference
                }
            }
        }
    }

    public double getGPSLocation() {
        double deltaTime = 0.0;
        double deltaDist = 0.0;
        //GPS Start
        if(isGPSEnable) {
            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return 0.0;
            }
//            lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if(lastKnownLocation == null ) {
                lastKnownLocation = nowLastlocation;
            }

            if (lastKnownLocation != null && nowLastlocation != null) {
                double lat1 = lastKnownLocation.getLatitude();
                double lng1 = lastKnownLocation.getLongitude();
                double lat2 = nowLastlocation.getLatitude();
                double lng2 = nowLastlocation.getLongitude();

                deltaTime = (nowLastlocation.getTime() - lastKnownLocation.getTime()) / 1000.0;  //시간 간격


                //double distanceMeter = distance(37.52135327,  126.93035147,  37.52135057,  126.93036593);
                deltaDist = distance(lat1,  lng1,  lat2,  lng2);
                if(deltaDist > 0.05) {
                    tvGpsLatitude.setText("Start Latitude : " + lat1);
                    tvGpsLongitude.setText("Start Longitude : " + lng1);
                    tvEndLatitude.setText("End Latitude : " + lat2);
                    tvEndLongitude.setText("End Longitude : " + lng2);
                    tvDistDif.setText("거리 간격 : " +  Double.parseDouble(String.format("%.3f",deltaDist)) + " m");  // Dist Difference
                    lastKnownLocation = nowLastlocation;
                    return deltaDist;
                }
//                lastKnownLocation = nowLastlocation;
            }
        }
        return 0.0;
    }

    @Override
    public void onLocationChanged(Location location) {
        nowLastlocation = location;
        Toast.makeText(this, "Locatiuon Changed", Toast.LENGTH_SHORT).show();
        double lng = location.getLongitude();
        double lat = location.getLatitude();
        Log.d("Now Location ::::::", "longtitude=" + lng + ", latitude=" + lat);
        tvNowLatitude.setText("Now Latitude : " + lat);
        tvNowLongitude.setText("Now Longitude : " + lng);
    }


    @Override
    public void onProviderEnabled(String provider) {
        //권한 체크
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        // 위치정보 업데이트
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, stepDetectorSensor, SensorManager.SENSOR_DELAY_UI);

        //권한 체크
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        // 위치정보 업데이트
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0, this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        sensorManager.unregisterListener(this);

        // 위치정보 가져오기 제거
        locationManager.removeUpdates(this);
    }

    @Override
    protected void onStart() {
        super.onStart();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            //권한이 없을 경우 최초 권한 요청 또는 사용자에 의한 재요청 확인
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION) &&
                    ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
                // 권한 재요청
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
                return;
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
                return;
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    // 거리계산
    private static double distance(double lat1, double lon1, double lat2, double lon2) {

        double theta = lon1 - lon2;
        double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));

        dist = Math.acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515;
        dist = dist * 1.609344 * 1000; //미터 단위

        return dist;
    }


    // This function converts decimal degrees to radians
    private static double deg2rad(double deg) {
        return (deg * Math.PI / 180.0);
    }

    // This function converts radians to decimal degrees
    private static double rad2deg(double rad) {
        return (rad * 180 / Math.PI);
    }


}

- copy coding -


안드로이드 어플을 테스트 하다 보면 Virtual Device로 테스트 하기 어려운 부분들이 있습니다.

지금 사용하는 핸드폰으로 테스트 하긴 아깝고 이럴 때는 집에 사용하지 않는 핸드폰을 연결을 해서 테스트 해야 겠지요.

그런데 탐색기로 핸드폰 폴더는 보이는데 안드로이드 스튜디오에서는 안잡히는 경우가 있습니다.

이런 경우 해결 방법을 알아 봅니다.



Virtual Device는 보이는데 위쪽에 핸드폰은 보이지 않는 상태 입니다.

Troubleshoot를 클릭해 봅니다.



G2가 목록에 보이지만 인식을 못하고 있네요.

하단에 있는 online documentation 을 클릭 합니다.

그럼 안드로이드 개발자 사이트에 접속이 됩니다.


https://developer.android.com/studio/run/oem-usb



LGE 라고 엘지 드라이버 사이트가 링크 되어 있네요.

그냥 제조사 홈페이지에 들어가서 검색해서 찾은 드라이버와 조금 다른 경우도 있습니다.

클릭을 합니다.



검색 창에 키워드를 입력하면 관련 기종이 검색 됩니다.



정확한 기종을 찾아 선택합니다.



Windows 용과 Mac 용이 있는데 해당 되는 운영체제용 USB Driver를 선택해 설치 진행 합니다.





드라이버 설치가 완료 되었습니다.


이제 다시 안드로이드 스튜디오로 돌아가 테스트를 진행해 봅니다.



OFFLINE 이라고 하네요.

디버깅을 허용하지 않은 것 같습니다.



이 컴퓨터에서 항상 허용을 체크 하고 확인을 선택 합니다.



이제 OFFLINE이 사라졌습니다.

 

지금부터 핸드폰을 이용해 좋은 앱을 만들어 봅니다.



1···891011121314···17

+ Recent posts