본문 바로가기

OS/Android

(50)
AudioRecord to Wav 저장용 원래라면, 안드로이드에서 녹음은 MediaRecorder 면 된다. 하지만, SpeechRecognizer 등이나 Cloud Speech 가 들어간다면…. 그 이유로는, 음성인식 자체도 마이크를 가져가고, MediaRecorder 도 마이크를 가져가니.. 그나마 다행인 것으로는 Cloud Speech 를 사용하기 위해서 AudioRecord를 사용한다는 것이다. 그러면, 아래와 같은 꼼수를 할 수 있을 것 같다. 사용자가 먼저 말하면, 그걸 byte[] 로 읽어서 그대로 구글 서버로 보내고, outputStream 에 쓰면 되겠다. 목차 1. AudioRecord 생성 2. FileOutputStream 생성 3. AudioRecord 버퍼 읽기 4. 이대로 끝..? 5. WAV 헤더 6. 위 설명을 바..
안드로이드 Room 안드로이드 Room은 구글 AAC(Android Architecture Components)에서 권장하는 DB ORM(Object Relationnal Mapping)으로써 기존 SQLITE의 불편함 때문에 만들어졌다. Annotation을 사용함으로써 기존 SQLITE에 비해 유지보수 및 가독성이 뛰어나고, 런타임일때만 쿼리 검사를 할 수 있었던 SQLITE와는 다르게 컴파일 환경에서 오류 검사를 할 수 있다는 점이 장점이다. 기본적으로 Room은 Main Thread에서 데이터베이스에 접근하는 것을 막아놓은 상태이다.(옵션을 사용하여 접근할 수 있지만 권장하지 않음) 이종현님이 개념과 옵션들을 잘 정리해주셨으니 참고하도록 하자. medium.com/@gus0000123/mvvm-aac-room%EC%..
안드로이드 request Permission 안드로이드 API 23 이상부터는 사용자들에게 권한을 요청해야만 권한을 얻을 수 있다. 앱을 시작할 때 한번에 권한을 획득하는게 개발자 입장에선 편하지만 유저 입장에서는 당혹스러울 수 있으니 해당 권한을 필요로하는 기능을 실행하기전에 요청 하는 것을 권한다. 권한을 요청하는 소스를 계속 복붙하다보면 겉잡을 수 없이 소스가 더러워질 수 있으니 클래스로 따로 빼서 개발하도록 하자. object ComPermission { enum class EnumPermission { STORAGE_PERMISSION, CAMERA_PERMISSION } const val PERMISSION_REQUEST_OK = 87 private val m_arrStoragePermissions = arrayOf(Manifest.pe..
안드로이드 targetSdkVersion 29에서 외부저장소 접근하기 이전에 저장소 관련해서 많이 바뀐거 같다. manifest에 android:requestLegacyExternalStorage="true" 추가
No field with the name mListener is found in Animation class support library에서 androidx로 컨버팅하니까 No field with the name mListener is found in Animation class라는 에러가 발생했다. 앱이 죽거나 ANR이 걸리는건 아니지만 찜찜해서 확인을 해봤다. https://issuetracker.google.com/issues/139349998https://issuetracker.google.com/issues/139349998 이 이슈를 보면 androidx에 관한 버그라는 것을 확인하였고 이 에러에 대해서 업데이트 되었다는 것을 알 수 있었다. implementation "androidx.fragment:fragment-ktx:1.2.5" 추가해줬더니 에러가 말끔히 사라짐^^
안드로이드 CustomView 생성자 public class CusView extends View { static String TAG = CusView.class.getSimpleName(); public CusView(Context context) { //코드상에서 부를때 호출된다. super(context); Log.d(TAG, "CusView(Context context) 호출"); } public CusView(Context context, @Nullable AttributeSet attrs) { // XML에서 부를때 호출된다. //View가 Inflating될 때 3번째 생성자를 호출하는 것이 일반적임 this(context, attrs, R.attr.editTextStyle); Log.d(TAG, "CusView(Context ..
안드로이드 Command Line으로 bundle 만들기 안드로이드 스튜디오에서 여러 프로젝트 번들을 만들때 컴퓨터가 너무 느려지고 다른 작업들을 할 수 없어서 커맨드 라인으로 번들을 만드는 방법을 찾아보았다. 안드로이드 모듈의 build.gradle을 열어준다. signingConfigs { release { storeFile file(testJks.jks) //키 스토어 파일의 위치를 적어준다. storePassword testStorePassword//키 스토어 패스트워드를 적어준다. keyAlias testAlias//키 Alias를 적어준다. keyPassword testKeyPassword //키 패스워드를 적어준다. } } buildTypes { release { signingConfig signingConfigs.release // 실제 마켓 배..
안드로이드 유튜브 검색 크롤링 유튜브 크롤링을 사용하여 컨텐츠 정보를 가지고 오도록 해봤다. json 데이터를 파싱해오기 위해서는 userAgent를 모바일에서 PC로 수정해줘야 한다. 검색 데이터를 가지고 오기 위한 url은 https://www.youtube.com/results?search_query=검색내용&page=페이지번호이다~~ class SearchTubeTask(var m_context : Context?, var m_strUrl : String?) : AsyncTask() { private var m_hSearchResultListener : OnSearchResultListener? = null private val USER_AGENT = "PC용 Agent" private val GOOGLE_URL = "http..