문제점


프로젝트 협업을 하다보면 프로젝트 폴더를 여기저기 옮겨다니면서 작업할 때가 많다. 

그 때 간혹 라이브러리import 하지 못해 코드가 빨간줄로 도배될 때가 있다.(원인은 자세히 모름..)

나와 같이 실수하는 사람이 있다면 아래의 해결방법을 따르면 된다.


해결방법


프로젝트를 File - Open 하지 않고 File - New - Import project.. 를 통해 연다.


Poi 라이브러리 다운받기


http://poi.apache.org/download.html

여기서 최신 stable 버전을 다운받으시면 됩니다. 

하지만 저는 다운받기 번거롭기 때문에 다음 방법을 이용했습니다.



간단하게 라이브러리 추가하는 방법


Build.gradledependencies에 다음을 추가합니다.

(최신버전을 확인 후 버전에 따라 다르게 등록)


1. xls를 사용할 경우

compile 'org.apache.poi:poi:3.15'


2. xlsx를 사용할 경우

compile 'org.apache.poi:poi-ooxml:3.15'


Poi 라이브러리 사용 방법


http://javaslave.tistory.com/79

버튼을 누르고 있을 동안 색을 바꿔주는 효과를 넣고 싶을 때가 있습니다.
그럴 때 selector를 이용하게 되는데 주의할 점은 TextColor와 background 색을 변경하는 것이 조금 다릅니다.
TextColor는 res의 color 디렉토리를 생성하여 그 안에 selector를 넣어주어야 하고
background는 res의 drawable 디렉토리 안에 selector를 넣어주어야 합니다.


background 색을 변경할 


button_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/bg_select"/>
    <item android:state_focused="true" android:drawable="@drawable/bg_select"/>
    <item android:state_pressed="true" android:drawable="@drawable/bg_select"/>
    <item android:drawable="@drawable/bg"/>
</selector>

TextColor를 변경할 때


text_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/colorBlue"/>
    <item android:state_focused="true" android:color="@color/colorBlue"/>
    <item android:state_pressed="true" android:color="@color/colorBlue"/>
    <item android:color="@color/colorWhite"/>
</selector>



colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="colorWhite">#FFFFFF</color>
    <color name="colorBlue">#2196F3</color>
    <drawable name="bg_select">#2196F3</drawable>
    <drawable name="bg">#EEEEEE</drawable>
</resources>

activity_main.xml

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="TextViewTest"
    android:textColor="@color/text_selector"/>
 
<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/button_selector"
    android:text="ButtonTest"/>




마시멜로부터는 BLE 스캔을 하기 위해서는 우선 ACCESS_COARSE_LOCATION 퍼미션을 런타임 때 주어야 합니다.



// BLE 관련 Permission 주기
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
    // Android M Permission check
    if(this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("This app needs location access");
        builder.setMessage("Please grant location access so this app can detect beacons.");
        builder.setPositiveButton("Ok", null);
        builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @TargetApi(Build.VERSION_CODES.M)
            @Override
            public void onDismiss(DialogInterface dialog) {
                requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
            }
        });
        builder.show();
    }
}



@Override
public void onRequestPermissionsResult(int reqeustCode, String permission[], int[] grantResults){
    switch (reqeustCode){
        case PERMISSION_REQUEST_COARSE_LOCATION:{
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                Log.d("permission", "coarse location permission granted");
            }else{
                final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Functionality limited");
                builder.setMessage("Since location access has not been granted, " +
                        "this app will not be able to discover beacons when in the background.");
                builder.setPositiveButton("Ok", null);
                builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
 
                    }
                });
                builder.show();
            }
            return;
        }
    }
}

이 퍼미션을 주지 않으면 BLE 스캔 정보를 받아오는 ScanCallback 함수로 아무런 정보가 넘어오지 않습니다. 
그리고 처음 앱을 킬 때 dialog 메시지 창을 통해 이 퍼미션에 대해서 동의를 하는지 묻고 한 번 동의를 하면 그뒤로 묻지 않습니다.


+ Recent posts