2018.08.19 00:08


아래와 같은 AndroidRuntime Error 메시지 발생시

android.os.FileUriExposedException: file:///storage/emulated/0/1534602883975.jpg exposed beyond app through ClipData.Item.getUri() 

android.os.StrictMode.onFileUriExposed(StrictMode.java:1960) 

at android.net.Uri.checkFileUriExposed(Uri.java:2356) 


위와같이 FileUriExposedException 발생하는 경우 


안드로이드 7.0 부터 Uri.fromFile() 사용 시 개인 파일의 보안을 강화하기 위해 개인 디렉토리의 액세스를 제한하여 SecurityException과 FileUriExposedException이 발생할 수 있다.

따라서 Uri클래스의 fromFile()를 통해 얻어온 Uri(“file://…”)가 카메라앱으로 공유함으로써 발생한 오류이다.

따라서 해결책으로 FileProvider 사용을 해야 한다.


FileProvider 관련 Google Android 링크

android 7.0 관련 수정사항



FileProvider 사용방법

  1. res> xml> file paths.xml 파일 생성

 

  1. AndroidManifest.xml에 Provider 추가.

 

  1. Uri.fromFile() 대신 FileProvider.getUriForFile

 

 



Posted by injunech
2018.05.13 19:51


[Android] Activity간 객체, 행렬 데이터 전달


ArrayList 와 행렬등의 데이터를 Activity 간 intent 에 담아서 전달하는 방법을 알아보도록 하겠습니다.


Step1. 데이터 클래스의 직렬화

우선 인자로 전달하기 위해서는 ArrayList에 담기는 데이터 클래스가 직렬화가 되어있어야 합니다.

public class User implements Serializable{

...

}


Step2. 인텐트에 데이터 담기

사용하는 방법은 동일합니다.


ArrayList<User> listUsers 객체 혹은 int [] item_list 라는 행렬등에 데이터를 담아준 상태에서

startActivity를 실행하셔서 전달하면 됩니다.

Intent it = new Intent(this, NextActivity.class);
it.putExtra("users", listUsers);
startActivity(it);

Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("item_list", item_list);
startActivity(intent);
finish();


Step3. 데이터 꺼내서 사용하기

아래와 같이 인텐트를 받는 액티비티에서 사용하시면 됩니다.


Intent intent = getIntent();
ArrayList<User> list = (ArrayList<User>) intent.getSerializableExtra("users");


Intent intent = getIntent();
item_list = (int[][]) intent.getSerializableExtra("item_list");




Posted by injunech
2018.05.08 16:56


[Android] Layout겹치기


윈도우는 빈 채로 생성되며 빈 윈도우 안에 레이아웃을 채워 넣어 UI를 구성하는데 이때는 다음 메소드를 호출 한다.

 

void setContentView(int layoutResID)

void setContentView(View view, [ViewGroup.LayoutParams params])

void addContentView(View view, ViewGroup.LayoutParams params)

 

다음 예제는 2개의 xml파일을 겹쳐서 보여주는 예제이다.

 

overlay1.xml

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

 

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="바닥 레이아웃" />

    <Button

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:text="바닥의 버튼"

     />

 

</LinearLayout>

 

overlay2.xml

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

    android:gravity="center"

    android:background="#40ffff00"

>

    <TextView

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:text="이것은 위쪽의 레이아웃 입니다."/>

 

    <Button

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:text="위쪽 버튼"/>

 

</LinearLayout>

 

Overlay.java

 

package com.example.overlay;

 

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.Window;

import android.widget.LinearLayout;

 

public class Overlay extends Activity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Window win = getWindow();

        win.setContentView(R.layout.overlay1);

        

        //전개자로 xml파일을 가져옴

        LayoutInflater inflater = (LayoutInflater)getSystemService(

                Context.LAYOUT_INFLATER_SERVICE);

        LinearLayout linear = (LinearLayout)inflater.inflate(R.layout.overlay2null);

          

        //파라미터를 세팅해줌

        LinearLayout.LayoutParams paramlinear = new LinearLayout.LayoutParams(

                LinearLayout.LayoutParams.MATCH_PARENT,

                LinearLayout.LayoutParams.MATCH_PARENT

                );

        

        //윈도우에 추가시킴

        win.addContentView(linear, paramlinear);

        

        

    }

 

 

}

 

실행화면

 

아래쪽 레이아웃은 위쪽 레이아웃 때문에 색상이 약간 변한다. 하지만 두 버튼은 독립적으로 동작해서 클릭 리스너를 추가 시킬 수 있다.





출처: http://gakari.tistory.com/entry/안드로이드-LayoutInflater를-활용한-레이아웃-겹치기 [가카리의 공부방]



Posted by injunech
2018.04.15 01:59


Android Studio build error about gradle

Could not find com.android.tools.build.gradle:3.0.0-alpha7


위와 같이 gradle 버전을 찾지 못할때

자신의 android studio 설치 폴더상의 gradle 버전을 확인해서 build.gradle 상에 설정해준다.


 

  1. open the file path(just as the log said): file:/C:/Users/dmin/Documents/android-studio/gradle/m2repository/com/android/tools/build/gradle/
  2. found this file

  3. just change classpath 'com.android.tools.build.gradle:3.0.0-alpha7' to classpath 'com.android.tools.build.gradle:* * * ' ; * * * is the exist gradle file;

  4. buildscript {
      repositories {
        ...
        // You need to add the following repository to download the
        // new plugin.
        google()
      }
    
      dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-alpha5'
      } 
    }







Posted by injunech
2017.12.11 17:59


[ Android Studio] 한글깨짐, File Encoding 설정


1.  Android Studio and Project File Encoding 설정


 File > Settings > Editor > File Encodings

 단축키 (Ctrl + Alt + S)

 Default 설정으로 UTF-8 로 설정 된 상태인것을 확인 한다.



2. 한글 깨진 파일 한글 정상적으로 보이게 수정 

프로젝트 파일내의 특정 코드에서 한글이 깨진경우


> Project Build 시에 아래와 같은 Encoding 에러 발생


> 아래와 같이 한글이 깨진 파일 선택


> 우측 하단에 Encoding Type 선택해서 x-windows-949 로 선택하고 팝업창 뜨면 Reload 선택



> 다시 기존 UTF-8 을 사용해야 하기 때문에 UTF-8 로 다시 선택하고 팝업창 뜨면 Convert 선택.

> 위와같이 수행하면 한글이 Android Studio Editor 에서 잘 보이고, App 에서도 깨지지 않는다.









Posted by injunech
2017.12.11 11:03


[Android] SDK 환경변수 설정


1. 환경변수 설정


> 윈도우버튼 마우스 오른쪽 버튼으로 시스템 실행 > 고급시스템 설정 > 환경 변수

> 혹은 윈도우 검색에 '시스템 환경변수 편집' 검색해서 환경변수 제어판 실행



> 환경 변수 : 시스템 변수 -> 새로만들기 


> 변수 이름에 Android-SDK, 변수 값에 본인의 Android SDK 설치 경로 입력



> 시스템변수 Path 에 JAVA JDK 폴더 경로 추가

  Android SDK 가 설치된 platform-tools 폴더 내에 adb.exe 파일이 존재한다.
  (\Android\Sdk\platform-tools)



  > Android-SDK 변수명과 platform-tools 폴더 경로를 추가하여 PATH에 환경 변수를 추가해준다.

     %Android-SDK%\platform-tools





2. Android SDK 환경변수 설정 확인


> Ctrl + R 눌러 실행 창에서 cmd 로 command 창 실행


> adb sherll 입력해서 아래와 같이 device 가 연결 된다면 완료




Posted by injunech
2017.12.09 01:55


[Android] Gradle 이란?


 Gradle 이란 빌드 배포 도구(build tool) 입니다.

프로젝트를 생성하면 다음과 같은 구조로 파일들이 생성됩니다.  안드로이드 스튜디오로 프로젝트를 만들면 Gradle이란 것도 같이 생성되는 것을 볼 수 있습니다. 

안드로이드 스튜디오(IDE)와 빌드 시스템이 서로 독립적이기 때문입니다. 이클립스에서는 프로젝트 빌드를 이클립스 내에서 담당했지만, 안드로이드 스튜디오는 코드의 편집만을 담당할 뿐, 빌드는 Gradle을 통해 모두 수행됩니다. 때문에, 간혹 안드로이드 스튜디오의 프로젝트 설정과 Gradle 빌드 설정이 동기화되지 않아 스튜디오에서 에러로 표시하는 경우도 있습니다. 하지만, 빌드 절차와 IDE가 분리되어 있기 떄문에 프로젝트를 더 깔끔하게 관리할 수 있게 되었습니다.


* 이전에는 라이브러리를 추가하려면 jar파일을 받아서 설정해줘야 했지만 라이브러리들이 많아짐에 따라 자동화 도구가 필요해지게 되었고 ant, maven, gradle 등의 라이브러리 관리 도구가 등장했습니다. 안드로이드 스튜디오에서는 Gradle을 채택하여 쓰고있습니다.


Gradle 공식 홈페이지 (https://gradle.org/)

https://gradle.org/install/


build.gradle

 모듈의 빌드 방법이 정의된 빌드스크립트입니다. 빌드에 사용할 SDK 버전부터 시작하여 애플리케이션 버전, 사용하는 라이브러리 등 다양한 항목을 설정하는 것이 가능합니다.


파일 내부의 옵션들에 대해서 하나씩 살펴보겠습니다.

    1. apply plugin: ‘com.android.application’

 apply plugin: ‘com.android.application’은 안드로이드 플러그인 사용을 gradle에 적용하는 것이다.  이 옵션은 top-level에서 선언되어야 합니다.


2. android {…}

 안드로이드와 관련된 빌드 설정은 이곳 안에서 세팅 됩니다.


3. compileSdkVersion, buildToolsVersion

 compileSdkVersion은 앱 컴파일시 사용할 SDK 버전을 지정합니다. buildToolsVersion 역시 사용할 빌드툴의 버전을 명시하는 부분입니다.


4. defaultConfig{…}

 AndroidManifest.xml에서 사용하는 설정들에 대해서 동적인 옵션을 주고 싶을 때 이 블록내에 포함시킵니다. 예를들면 versionCode나 versionName등의 값을 이곳에서 설정 할 수 있습니다.


5. buildTypes{…}

 dev, alpha, beta, release 같이 빌드 타입 종류를 지정합니다.


6. dependencies{…}

 라이브러리와 같은 의존성 추가 시 이곳에 작성합니다.


Gradle 및 Android Studio Build 구조에 대한 내용은 아래 구글 Dev안드로이드 링크 참조

https://developer.android.com/studio/build/index.html




Posted by injunech
2017.03.07 04:59


Android Studio 에서 Android Version N 이상의 모바일단말을 구동시에 아래와 같은 에러가 발생하는경우 JDK 의 버전을 최신으로 업데이트 해주어야 한다.


Error:(1, 1) A problem occurred evaluating project ':app'.

java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0


# 문제해결 방법

Download latest java jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

In Android Studio , go to File > Project Structure > SDK Location > select JDK Location path to point to the new jdk installed (Ex: C:\Program Files\Java\jdk1.8.0_111 )




Posted by injunech
2017.03.05 10:30


Android Studio 단축키 Eclipse와 똑같이 설정하기


어쩔수 없이 안드로이드 스튜디오를 쓰는데, 역시 이전에 쓰던 버릇을 고치기가 쉽지 않다.
다른건 어쩔수 없다 쳐도 단축키는 바꿀수가 있는데...


"File > Settings ... " 메뉴로 가서...


"Keymap > Eclipse" 를 지정하면 이클립스에서 사용하던 단축키와 동일하게 바꿔 준다.

'Computer > Android' 카테고리의 다른 글

[Android] Gradle 이란?  (0) 2017.12.09
[Android Studio] JDK version 설정오류  (0) 2017.03.07
Android Studio 단축키 Eclipse와 똑같이 설정하기  (0) 2017.03.05
[Android] 특수문자 넣기  (0) 2017.02.27
[Android] View 절대 좌표값  (0) 2017.02.21
[Android] Color  (0) 2017.02.19


Posted by injunech
2017.02.27 19:06


안드로이드 화면을 그리는 xml 에서 특수문자를 사용하면 아래와 같은 에러 메시지가 발생함을 보실수 있습니다.


[잘못된 예]

   <TextView

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="TEST & CHAR"

     />


[에러 메시지]

 Multiple annotations found at this line:

- The entity name must immediately follow the '&' in the entity reference.

- [I18N] Hardcoded string "HOME & TECH", should use @string resource


특수문자를 사용하기 위해서는 string에 선언해 놓고 불러서 쓰는 방법이 있습니다만 귀찮은 관계로 유니코드형태로 입력을 해보도록 하겠습니다. 특수문자의 유니코드를 알기 위해서는 구글링링을 하면 됩니다. 하지만 저는 또한 귀찮은 관계로 컴퓨터에 내장된 프로그램을 이용해서 찾아보도록 하겠습니다.


[해결 방법]

시작버튼>실행>charmap 입력





원하는 특수문자 선택




& 같은 경우는 U+0026: Ampersand 라고 표시됨을 볼수 있습니다.

3.  이제 xml 로 돌아가서

 역슬래시 0026 --> \u0026 로 입력을 해주면 됩니다.



[특수문자 사용한 xml 예시]

     <TextView

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:text="HOME \u0026 TECH"

      />



출처: http://al02000.tistory.com/4 



Posted by injunech