반응형

 

나 같은경우는 딱히 코드스타일을 따지지 않았다.. 

폰트만 변경을 해서 사용을 하였는데

대규모 프로젝트를 하거나 여러명이 개발을 할 때  소스코드의 통일성 과 가독성을 높이고

유지보수성을 높이기 위하여 코드 컨벤션을 변경을 한다고 한다.

 

*Google kotlin code Style 적용.

 - 옵션 > Editor > Code Style > Kotlin > 우측 set from > kotlin style guide click

 - 옵션 > Editor > Inspections > Style issues >  File is not formatted according to project settings ( click to the check box )

적용을 하면 위 이미지 처럼 Google kotlin Code style을 맞춰준다. 

 

 

--------------------

위처럼 기본적으로 할 수 있고. 따로 팀원들의 취향에 따라 맞출수도 있는데 

 

 - 옵션 > Code Style > 상단 Scheme 오른쪽으로 톱니바퀴 > Import Scheme 로 불러올 수도있음.  

 

 

https://github.com/google/styleguide

 

GitHub - google/styleguide: Style guides for Google-originated open-source projects

Style guides for Google-originated open-source projects - GitHub - google/styleguide: Style guides for Google-originated open-source projects

github.com

 

https://developer.android.com/kotlin/style-guide

 

Kotlin 스타일 가이드  |  Android 개발자  |  Android Developers

Kotlin 스타일 가이드 이 문서에서는 Kotlin 프로그래밍 언어의 소스 코드와 관련된 Google의 Android 코딩 표준을 완벽하게 정의합니다. Kotlin 소스 파일은 이 규칙을 준수하는 경우에만 Google Android 스

developer.android.com

 

반응형
반응형

계획의 세부목표. 

 

 

 

목표 

정보처리기사 실기 필 합격!! 공부 계획

 

 

목표일정 

2022.02.04 (금) ~ 2022.05.07.(토) 

 

 

아이템

  • 정보처리기사 실기 책
  • 메모장
  • 휴대 간편한 메모장 ( 암기장 )

 

 

 

계획의 단계 ( 역순 )

 

  • 5단계

 

[ 시험 ]

- 그동안 준비 했던 기량을 보여줄 때임. 

 

 

 

  • 4단계

 

[실기 책 모두 정독을 한 후에는?]

 

- 각 섹션의 기출문제를 풀면서 모르는 부분은 다시 정독하여 머릿속에 암기한다. ( 반복 )

- 시나공에서 제공하는 쪽지 문제를 시간날때마다 푼다. 

 

 

 

  • 3단계

 

[ 복습은 어떻게 할 것인가? ]

 

- 공부를 진행 할때 주요 키워드를  질의 응답 식으로 메모하여 문제를 맞추는 식으로 진행 하여 암기.

 

 

 

  • 2단계

 

[ 2시간 목표로 어떻게 공부 할 것인가? ]

 

     - 퇴근 후 오후 7시 10분 부터 다음날 새벽 1시까지 공부를 목표

     - 현재부터 시험 일자까지 하루당 약 2.17 섹션을 공부 할 수 있다.  

     - 최소 3섹션 이상 진도를 나간다. ( 문제 풀이 시간 포함 )

 

 

 

  • 1단계

 

[ 하루 2 시간 공부 목표  ]

[ 하루 최소 3섹션 이상 진도 나가기 ]

     

 

반응형
반응형

키보드에 대문자만 나오게 하고싶어서

아래 코드를 작성을해서 EditText Filter를 수정하였는데  특정 기기에서는 그렇게 되질 않네.

InputFilter.AllCaps()

아래와같이 Text를 관찰해야 해야 기기 문제 발생하지 않고 깔끔하게 되더라. 

((EditText) findViewById(R.id.edit_id)).addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {

        if (s.toString().equals(s.toString().toUpperCase())) return;

        ((EditText) findViewById(R.id.edit_id))
                .setText(s.toString().toUpperCase());

        ((EditText) findViewById(R.id.edit_id))
                .setSelection(((EditText) findViewById(R.id.edit_id)).length());
    }
});

 

 

반응형
반응형

API를 호출할때 ServerKey를 사용하게 되는 경우가 있는데 

이걸 코드에 올려놓는경우가 있다. 

 

이러면 Github에 공개 프로젝트로 올리게 되는 경우 문제가되어서 삭제를하고 올려놓거나 번거로운 작업을 하게된다.

이럴때는 아래처럼 작업을 하면 구태여 삭제 하지 않아도 된다.

 

 

local.properties를 이용한다.

1. 변수와 키값을 작성. 

 

2. Build.gradle(.app) 파일 작성 

 

def Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

android 상단에 위 코드 작성. 

properties를 Load함. 

 

3. Build.gradle(.app) > defaultConfig 안에 코드 작성.  

buildConfigField("String", "serverKey", properties.getProperty("api.key"))

 

4.  Build > ReBuild Project 

 

 이처럼 작성을 하게 되면 github에서 확인이 안되고 맘편히 코드에서 Key Load가 가능하다. 

 

5. 아래 처럼 코드에서 확인이 가능.

Log.d("key->", BuildConfig.serverKey)

 

반응형
반응형

기기마다 상이함. 

 

안내문구는 아래와 같이.. 

 

마켓에서 업데이트 버튼이 노출되는 시기는 기기마다 조금씩 상이할  있습니다. 

 

이러한 경우 아래와 같이 임시 조치 방안을 안내해 드리니 참고 부탁 드립니다.

휴대폰 [ 설정 ] - [ 애플리케이션 ] - [Google Play 스토어 ] - [ 저장공간 ] - [ 데이터 삭제 ]  [ 캐시 삭제 ] 진행

 ! Google Play 스토어 앱의 데이터/캐시 삭제를 진행해 주셔야 합니다.

반응형

'IT 이야기 > 2022_Android 이것저것' 카테고리의 다른 글

Android Studio Code Style  (0) 2022.02.07
Android Edittext Keyboard 대문자.  (0) 2022.01.21
Android 민감한 API_KEY 숨기기  (0) 2022.01.19
Android Image Path To Uri  (0) 2022.01.07
Android 11 외부 앱 실행  (0) 2022.01.06
반응형

 

fun getImageContentUri(path : String) : Uri? {

    val cursor = context?.contentResolver?.query(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    ,  arrayOf(MediaStore.Images.Media._ID)
    , MediaStore.Images.Media.DATA+"=? "
    , arrayOf(path)
    , null
    )

    if (cursor != null && cursor.moveToFirst()) {

        val idx = cursor.getColumnIndex(MediaStore.MediaColumns._ID)
        val id = cursor.getInt(idx)
        return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI , id.toString())

    }  else if (path.isNotEmpty()) {

        val values = ContentValues()
        values.put(MediaStore.Images.Media.DATA , path)
        return context?.contentResolver?.insert(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI , values
        )
    }

    return null
}

 

반응형
반응형

외부 앱 실행을 하기위해서 .. 평소처럼 작업을 했는데  하단 호출 Intent가 Null값이 발생된다.

packageManager.getLaunchIntentForPackage

이는 Android11 에서 불러올 수 있는 패키지를 제한 해 두었기 때문. 

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

위 권한을 사용을 하여 설치된 모든 패키지를 불러 오던가. .

 

<queries>
    <package android:name="packageName" />
</queries>

하단 처럼 제한 되게 불러오던가 해야함.. 

 

앱에 성질마다 다를듯 하다. 

 

반응형
반응형

1.MotionLayout 이란? 

 

모션과 위젯 애니메이션을 관리하는 사용할 수 있는 레이아웃 유형 이다.

MotionLayout은 ConstraintLayout 서브 클래스 이다. 

 

2 . MotionLayout 을 사용해서 얻는 이점 

 

  2-1. MotionLayout은 레이아웃 전환과 복잡한 모션 처리 사이를 연결하며 속성 애니메이션 프레임워크 ,   TransitionManager 및    CoordinatorLayout 사이의 혼합된 기능을 제공한다. 

 

  2-2. MotionLayout을 사용하여 레이아웃 속성을 애니메이션으로 보여줄수있다.

검색 가능 전환 ? 을 지원한다. ( 터치 입력과 같은 일부 조건에 따라 전환 내의 포인트를 즉시  표시. )

키프레임도 지원 하므로 사용자의 필요에 맞게 완전히 맞춤설정된 전환을 사용. 

 

*키프레임 :  시작 시간과 종료 시간을 지정하고 그 사이에 움직임과 같은 효과를 넣는 작업

 

  2-3. MotionLayout은 완전히 선언 가능하므로, 복잡도에 상관없이 XML로 모든 전환을 설명할 수 있습니다.

 

 

3. MotionLayout을 분석해보자. 

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:motion="http://schemas.android.com/apk/res-auto">

        <Transition
            motion:constraintSetStart="@+id/start"
            motion:constraintSetEnd="@+id/end"
            motion:duration="1000">
            <OnSwipe
                motion:touchAnchorId="@+id/button"
                motion:touchAnchorSide="right"
                motion:dragDirection="dragRight" />
        </Transition>

        <ConstraintSet android:id="@+id/start">
            <Constraint
                android:id="@+id/button"
                android:layout_width="64dp"
                android:layout_height="64dp"
                android:layout_marginStart="8dp"
                motion:layout_constraintBottom_toBottomOf="parent"
                motion:layout_constraintStart_toStartOf="parent"
                motion:layout_constraintTop_toTopOf="parent" />
        </ConstraintSet>

        <ConstraintSet android:id="@+id/end">
            <Constraint
                android:id="@+id/button"
                android:layout_width="64dp"
                android:layout_height="64dp"
                android:layout_marginEnd="8dp"
                motion:layout_constraintBottom_toBottomOf="parent"
                motion:layout_constraintEnd_toEndOf="parent"
                motion:layout_constraintTop_toTopOf="parent" />
        </ConstraintSet>

    </MotionScene>

                                                                                                                                                                       <레퍼런스 기본 예제>

 

<Transition> 모션의 기본정의

       - motion:constraintSetStart  / motion:constraintSetEnd  시작 종료 모션의 포인트 

     위의 포인트들은 나중에 MotionScene에서 참조하여 정의됨.

 

     -motion:duration 은 모션 완료되는데 걸리는 시간. 

-motionInterpolator 은 애니메이션의 보간처리? 

 

<OnSwipe>를 사용하면 터치를 통해 모션을 제어할수있음. 

     - motion:touchAnchorId 는 컨트롤 할 수 있는 뷰를 나타냄.

     -motion:touchAnchorSide ??

     -motion:dragDirection 는 진행률 증가?

    

<ConstraintSet> 은 제약조건을 정의 하고 엔드포인트마다 정의함. (포인트마다 있을필요는 없는듯.?)

 <ConstaintSet> 안에 <Constraint>가 정의됨. 

  ---Constraint 기타 속성들. 

  • alpha
  • visibility
  • elevation
  • rotation, rotationX, rotationY
  • translationZ translationY translationX
  • scaleX, scaleY

<CustomAttribute> 는  <ConstaintSet> 을 변경할때 사용? 

 

4. MotionLayout으로 무엇을 만들수있을까? 

예제 따라한것.

https://github.com/ShinHoChull/MotionLayout

 

음.. 여러개 생각난건 있는데.. 

한번 해본다음에 수정사항 적용해야겠음.

 

5. MotionLayout을 사용해서 느낀점. 

백문불여일견 역시 한번 해보니 이해가 빨랐다.. 

나는 여태까지 코드로 수정했는데.. MotionLayout 으로 이렇게 될줄이야.. 

오래전에 나온거긴한데 .. 세삼 새롭네 ..

이제 코드로 애니메이션 시작 종료를 캐치할수있는지 좀 확인해봐야겠다.. 

가능하다면 여러가지 복합적으로 할 수 있을듯..? 

반응형
반응형

(GPS  주기적인 호출에 관하여..)

음 일단 도즈모드에대해서 이해를 했다면 도움이 됨.

나는 아래 권한을 사용자에게 받아내어서 최적화에서 앱을 제외하면 백그라운드에서 정상적으로 실행이 될 줄 알았다.

ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

 

나는 보통 테스트를 할때  일반적으로 휴대폰을 켜고 사용하고  충전을 하고 음....등등

GPS 테스트 할때도 마찬가지로 휴대폰을 가지고 이동하고 확인하고 잘 되나 보고.. 뭐 문제가 없었다. 

그렇게 지나가는듯 했으나 어쩌다가  위치를 30초 마다 호출을 했는데 찍힌 경로를 보니 이상하게 .. 30초 단위로 찍히지 않음.. 

경로에 공백이 있다.. 

알고보니 도즈모드때문에 그런거였고.. 위 권한 하고는 크게 상관이 없더라.. 

위 권한을 승인받으면 시스템에서 살려주는 주지만 언제 요청하는지는 알 수 없다라고 말하는 듯... 

한참을 좀 해맸는데 .. 잘 해결되서 글을 남긴다. 

나 처럼 백그라운드에서 주기적으로 위치를 요청할라고하면 

뭐 필요한 권한은 알아서 구글님에게 승인을 받으시고 .. 

아래 코드를 사용하면 됨

<Service.kt>

lateinit var mgr : AlarmManager
private fun scheduleAlarms(ctxt: Context) {

    val i = Intent(ctxt, AReceiver::class.java)
    val pi = PendingIntent.getBroadcast(ctxt, 0, i, 0)

    val i2 = Intent(ctxt, AReceiver::class.java)
    val pi2 = PendingIntent.getActivity(ctxt, 0, i2, 0)
    val ac = AlarmClockInfo(
        System.currentTimeMillis() + INTERVAL_TIME,
        pi2
    )
    mgr.setAlarmClock(ac, pi)
}

 

<Receiver.kr>

class AReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {

        Defines.log("hello broadcast~")

        //showNotification(context!!)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val ain = Intent(context, MyService3::class.java)
            ain.putExtra("flag", "re")
            context?.startForegroundService(ain)
        } else {
            val ain = Intent(context, MyService3::class.java)
            ain.putExtra("flag", "re")
            context?.startService(ain)
        }

    }
}

이런식으로 리시버에서 다시 서비스를 호출하면 끈김없이 잘 통신 됨. 

 

반응형

'IT 이야기 > 2021_Android 이것저것' 카테고리의 다른 글

안드로이드 Webview HTTP  (0) 2022.03.18
MotionLayout 맛보기..  (0) 2021.12.29
GPS 위치 정확도 승인  (0) 2021.12.07
RecycleView 높이 가변적으로 조절..  (0) 2021.12.01
Web 에서 App 호출.  (0) 2021.11.29
반응형

 

위치 정확도란.. GPS 해보면 알다싶이.. 위치가 그렇게 정확하지가 않다.. 

사용자에게 위치 정확도 개선 승인을 받으면 그래도 좀더 정확해진다.. 

나는 onResume에서 계속 확인한다.. 

 

필요한사람은 가져다 쓰도록해요~ ..

	//위치 정확도 개선 요청.
    public void requestGpsSettingChange() {
        LocationRequest request = LocationRequest.create();
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        LocationSettingsRequest.Builder builder =
                new LocationSettingsRequest.Builder().addLocationRequest(request);

        Task<LocationSettingsResponse> result = LocationServices
                .getSettingsClient(getApplicationContext())
                .checkLocationSettings(builder.build());

        result.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
            @Override
            public void onSuccess(LocationSettingsResponse locationSettingsResponse) {

            }
        });

        result.addOnFailureListener(this, new OnFailureListener() {

            @Override
            public void onFailure(@NonNull Exception e) {

                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    resolvable.startResolutionForResult(MainActivity.this,
                            REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException sendEx) {
                    // Ignore the error.
                }
            }
        });
    }

 

https://developer.android.com/training/location/change-location-settings?hl=ko

반응형

+ Recent posts