반응형

 

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

반응형
반응형

음.. 난 당연하게 계산을 해왔다.. 

갑자기..문득.. 있을까 찾아봤는데 있네.. 

height = "wrap_content"로 주고..

app:layout_constrainedHeight="true"

입력해주면 .. 늘어난다..

 

물론 Parent는 ScrollView.. 

반응형
반응형

-Android Manifest

<activity
            android:name=".Activity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>


            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="test_web"
                    android:scheme="test" />
            </intent-filter>


        </activity>

 

-Web 

 

var userAgent = navigator.userAgent; 

if(userAgent.match(".*Android.*")){
location.href = 'intent://test_web#Intent;scheme=test;package=kr.co.test;end'

}

-Android 앱으로 보낼 데이터가 있을경우

location.href = 'intent://test_web?data=0#Intent;scheme=test;package=kr.co.test;end'

 

-Android 데이터 받기

( Filter 설정한 Activity에서)

 

String data = intent.getData().getQueryParameter("data")

*앱을 종료 한 후 호출해야 데이터가 받아짐. 

그 Intent 메소드 재정의해서 사용하면 되나..?( 아직해보진 않음..  )

반응형
반응형

안드로이드 doze모드 만들기

1. sdk 설치한 디렉토리로 이동한다.
2. platform-tools로 이동한다.
3. adb 파일을 확인 후 아래 명령어를 입력한다.
 1) adb shell dumpsys battery unplug  * 베터리를 빼는 효과
 2) 화면을 끈다. (화면이 켜져있으면 active모드에서 넘어가지 않는다)
 3) adb shell dumpsys deviceidle step 을 입력한다. 입력 할때마다 상태가 바뀌는데 상태값에 대한 내용은 4가지정도 이다.
   - IDLE_PENDING   (준비중)
   - SENSING    (세팅하세요)
   - IDLE  (Doze모드가 되었습니다.)
   - IDLE_MAINTENANCE  (Doze모드인데 가끔 잠에서 일어납니다)
 4) IDLE모드가 되면 Doze모드이므로 바뀔 때 까지 "3)번항목" 명령어를 입력해준다(연타하지는말자)

4. Doze모드를 푸는 방법
 1) adb shell dumpsys battery reset 입력한다.
 2) adb shell dumpsys deviceidle step 입력한다.

5. 베터리크기 조정
 - adb shell dumpsys battery set level 5 (숫자값이 베터리 크기)

 

-https://lts0606.tistory.com/78

반응형

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

RecycleView 높이 가변적으로 조절..  (0) 2021.12.01
Web 에서 App 호출.  (0) 2021.11.29
wav파일 사이즈  (0) 2021.11.09
BottomNavigation + 각 Navigation  (0) 2021.11.09
Mac ADB 셋팅.  (0) 2021.10.14
반응형

확장자 WAV 파일이 다른 기기에서는 음량이 잘나는데 특정 기기에서 음량이 안나는 문제가 있더라.

알고보니 245?KB를 넘어서는 안된다고 함. 

이유는 안찾아봄. 

여튼 사이즈 줄이니 잘됨. 

반응형
반응형

나는 궁극적인 목적이 각 하단 메뉴들을 각각의 네비게이션을 시각적으로 정리를 하고싶었다. 

 

근데.. 코틀린에서는 금방 찾았지만 자바에서는 각각의 네비게이션 분리하는 작업을 찾기 힘들었다. 

생각의 전환으로 쉽게 해결해서 참.. 좋지만서도 허무하다. 

좋은 방법이 있는거 같긴한데.. 찾아봐야겠다. 

 

 

  1. 메뉴 설정 

 

2.각각의 네비게이션 등록 

3. Fragment들은 만들어줬다는 가정하에 

 

 

4.여기서 Fragment bottomViewNavigation이랑 연결을 해주고나서
fragment navGraph 분기처리 해주면 된다.
그러면 onDestinationChanged 될것이다. 

 

반응형

+ Recent posts