728x90

java .lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter errorMessage

 

 

원인: java 파일을 가져다가 Kotlin으로 컨버팅 시켰을때 주로 발생하는 에러. 빌드시 에러 미발생, 런타임에서 발생.
수정: kotlin에 맞게 다시금 override해서 nullCheck관련 설정이 붙은 매개변수로 변경하면 문제 해결됨

 

 

Reference

gogorchg.tistory.com/entry/Kotlin-Parameter-specified-as-nonnull-is-null-method-kotlinjvminternalIntrinsicscheckParameterIsNotNull-parameter-intent

728x90
728x90

안드로이드 기기에서 자료를 저장하는 방법은 크게 다음 4가지가 있다.  (온라인 전송은 논외이므로 제외)

1. 내부저장장치 InternalStorage
2. 외부저장장치 ExternalStorage
3. DB 저장 : SQLite
4. SharedPreferences

 

---------------------------------------------------------------------------------------------
1.안드로이드의 내부저장장치 (InternalStorage)

기본적으로 자바의 파일 입출력 스트림을 사용하며, openFileOutput()  과 openFileInput() 을 사용하여 안드로이드 내부 저장장치 에 파일을 생성하여 쓰고 읽기를 합니다.

 

참고: 외부 저장소 디렉터리와 달리 앱은 이러한 메서드에 의해 반환된 내부 디렉터리를 읽고 쓰는 데 시스템 권한이 필요하지 않습니다.

 

getFilesDir()앱의 내부 디렉터리를 나타내는 File을 반환합니다.

getCacheDir() 앱의 임시 캐시 파일의 내부 디렉터리를 나타내는 File을 반환합니다. 더 이상 필요하지 않은 파일을 모두 삭제하고 언제든지 사용할 수 있는 메모리 양에 관해 합리적인 크기 제한(예: 1MB)을 구현해야 합니다.

주의: 저장용량이 부족하면 시스템은 경고 없이 캐시 파일을 삭제할 수 있습니다.

 

 

Caution: On devices that run Android 7.0 (API level 24) or higher, unless you pass the Context.MODE_PRIVATE file mode into openFileOutput(), a SecurityException occurs.

 

openFileOutput() 메서드에는 파일 모드 매개변수가 필요합니다. MODE_PRIVATE을 전달하면 파일이 비공개로 앱에 전달됩니다. 다른 모드 옵션인 MODE_WORLD_READABLE  MODE_WORLD_WRITEABLE은 API 레벨 17부터 더 이상 사용되지 않습니다. Android 7.0(API 레벨 24)부터는 Android에서 이러한 옵션이 사용되면 SecurityException이 발생합니다. 앱이 다른 앱과 비공개 파일을 공유해야 한다면 FLAG_GRANT_READ_URI_PERMISSION 속성과 함께 FileProvider를 대신 사용해야 합니다. 자세한 내용은 파일 공유를 참조하세요.

Android 6.0(API 레벨 23) 이하에서는 누구든지 읽을 수 있도록 파일 모드(MODE_WORLD_READABLE)를 설정하면 다른 앱이 내부 파일을 읽을 수 있습니다. 하지만 다른 앱이 개발자 앱의 패키지 이름 및 파일 이름을 알아야 읽을 수 있습니다. 파일을 읽기 가능 또는 쓰기 가능으로 명시적으로 설정하지 않으면 다른 앱은 개발자 앱의 내부 디렉터리를 탐색할 수 없으며 읽기 또는 쓰기 권한도 갖지 못합니다. 따라서 내부 저장소의 파일에 MODE_PRIVATE을 사용하는 한 다른 앱이 이러한 파일에 액세스할 수 없습니다.

 

Reference

https://codedragon.tistory.com/353

https://bitsoul.tistory.com/tag/안드로이드저장장치 내부저장장치 InternalStorage openFileInput openFileOutput

https://developer.android.com/training/data-storage/files/internal?hl=ko

 

 

 

728x90
728x90

구글님 왈, ProgressDialog는 API Level 26부터 더 이상 쓰지 말라 그런다.

그렇다면 어떻게 대체를 해야하나?

Custom으로 비슷한 기능을 하는 애들을 만들어야하는데...

 

먼저 Dialog, AlertDialog, DialogFragment 등을 비교

 

1. Dialog 

- xml로 대화상자 화면을 구성. 즉 xml을 띄워주는형식이기 떄문에 onCreateView 메소드를 사용.

 

2. AlertDialog 
- 빌더 코드 형식. 따라서 xml 파일은 필요없고 자바 클래스 하나만 있으면됨.

- AlertDialog는 Dialog 그 자체이기 떄문에 Dialog onCreateDialog 메소드를 가져옴.

 

3. DialogFragment

- AlertDialog를 관리하는 Fragment를 만들어 사용할 수 있도록 제공되는 Fragment. AlertDialog와 큰 차이는 없음.

- 해당 기능 사용지 마시멜로 버전 에러가 있는데, 아래 블로그에서 상세히 잘 다루심 

  https://oneday0012.tistory.com/142

 

 

우선은 Dialog로 커스텀하는 방식을 고려중

상세 화면을 만들 때는 아래 링크 참조.

https://qastack.kr/programming/45373007/progressdialog-is-deprecated-what-is-the-alternate-one-to-use

 

 

 

 

Reference

http://egloos.zum.com/monibu/v/4156664

https://hyunndyblog.tistory.com/109

https://oneday0012.tistory.com/142

https://qastack.kr/programming/45373007/progressdialog-is-deprecated-what-is-the-alternate-one-to-use

728x90
728x90

 

I found a solution (thanks to user1506104) to changing the toolbar's title, which did not use getSupportActionBar().setTitle().

CollapsingToolbarLayout toolbarLayout = findViewById(R.id.toolbar_layout); 
Toolbar toolbar = findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

mViewModel.getValue().observe(this, mValue -> { 
	toolbarLayout.setTitle(mValue); });

Where R.id.toolbar_layout is the CollapsingToolbarLayout that parents R.id.toolbar in the activity's respective layout resource.

I do not know why it works unfortunately.

 

Reference

 

https://stackoverflow.com/questions/60467526/how-to-execute-settitle-for-an-actionbar-in-an-activitys-observe-call-for-a-v

 

 

How to execute setTitle() for an ActionBar in an activity's observe call for a ViewModel's LiveData object?

In an activity file, when I write getSupportActionBar().setTitle(...) in an instantiated observer interface for a view model's LiveData value, the action bar's title doesn't change on the observabl...

stackoverflow.com

 

 

728x90

+ Recent posts