반응형

안녕하세요. 

 

빠르게 Estimote의 Beacon 세 개를 이용해 안드로이드 폰으로 삼변측량을 구현하기 위해 AltBeacon Library를 사용했습니다. (Beacon 구현)

 

간단하기 때문에 쉽게 구현할 수 있습니다. 중요한 부분만 집어 이야기 하겠습니다.

 

altbeacon.github.io/android-beacon-library/index.html

 

Android Beacon Library

The leading library for detecting beacons on Android. What Does This Library Do? It allows Android devices to use beacons much like iOS devices do. An app can request to get notifications when one or more beacons appear or disappear. An app can also reques

altbeacon.github.io

 

1. Configure (build.gradle)

최신 버전

 

2. Permissions (AndroidManifest.xml)

안드로이드 버전 별 이슈는 위 사이트 참고

 

 

3. Implements (MainActivity.java)

altbeacon.github.io/android-beacon-library/samples.html

 

Android Beacon Library

Reference Application A minimalist reference application for the Open Source Library is available on GitHub that demonstrates basic ranging and monitoring. It is based on the examples below. Requesting Permission IMPORTANT: Your app must request permission

altbeacon.github.io

 

Ranging Example Code를 사용하여 Distance를 구할 수 있다. ( getDistance() 메소드 사용 )

 

하지만 getDistance 메소드 대신 아래 메소드를 추천합니다. ( 실제 실험 환경의 곡선을 가진 방정식 )

protected static double calculateDistance(int measuredPower, double rssi) {
  if (rssi == 0) {
    return -1.0; // if we cannot determine distance, return -1.
  }
  double ratio = rssi*1.0/measuredPower;
  if (ratio < 1.0) {
    return Math.pow(ratio,10);
  }
  else {
    double distance =  (0.89976)*Math.pow(ratio,7.7095) + 0.111;
    return distance;
  }
}

 

4. Error (AltBeacon 종속성 추가)

오류

Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.localbroadcastmanager.content.LocalBroadcastManager"

 

해결 (build.gradle에 추가)

 implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'

 

 

5. 응용 (Beacon Parser)

Beacon은 대표적으로 Estimote(Apple)와 EddyStone(Google)이 있으므로, Beacon Scan 하기 위한 Beacon을 parsing 해야 한다. 

 

 

위 오픈소스 설명이 굉장히 잘 돼있기 때문에 자세한 설명은 하지 않고, 큰 틀로 이야기를 진행했습니다.

 

iBeacon이 Eddystone보다 약 2년 정도 일찍 출시되어, Beacon 하면 iBeacon을 많이 이야기합니다. 

 

후속작인 Eddystone은 URL을 Broadcasting 하여 주변 기기에게 전송할 수 있고, TLM을 통해 비콘의 상태를 확인할 수 있습니다. 

www.youtube.com/watch?v=HRP1tfXHiVg&t=67s

passkit.com/blog/what-is-eddystone-and-is-it-the-future-of-beacon-tech/

 

What Is Eddystone and Is It The Future Of Beacon Tech?

Back in July, Google released Eddystone, an open source beacon format that is changing the way we use beacons. Here's what you need to know.

passkit.com

 

 

cf) 삼변측량 Library

github.com/lemmingapex/trilateration

 

lemmingapex/trilateration

Solves a formulation of n-D space trilateration problem using a nonlinear least squares optimizer - lemmingapex/trilateration

github.com

 

728x90
반응형
반응형

Explicit Intent인텐트를 충족하는 애플리케이션이 무엇인지 지정합니다. 이를 위해 대상 앱의 패키지 이름 또는 완전히 자격을 갖춘 구성 요소 클래스 이름을 제공.

 

ex) Page1에서 Page2로 넘어갈 때, 사용되는 노드 같은 것

 

 

0. AndroidManifest.xml ( SecondActivty를 manifest에 추가 )

        <activity android:name=".SecondActivity">

        </activity>

 

 

1. first_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button"
        android:onClick="ClickButton"
        android:id="@+id/btn">

    </Button>

</LinearLayout>

2. MainActivity.java (Activity A)

package com.example.project8_intent;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
		
        // Button Event
        Button btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view)
            {
                // intent ( Start Point : Main -> End Point : SecondActivity )
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

 Button Click했을 때( Start Point : MainActivity ---> End Point : SecondActivity )

 

 

 

3. second_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Second Button"
        android:id="@+id/btn2"
        >

    </Button>

</LinearLayout>

4. SecondActivity.java

package com.example.project8_intent;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);

        Button btn = (Button)findViewById(R.id.btn2);
		
        // SecondActivity 종료
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                finish();

            }
        });
    }
}

 Button Click했을 때( SecondActivity 종료)

 

 

MainActvity.java
SecondActivty

 

developer.android.com/guide/components/intents-filters?hl=ko#java

 

인텐트 및 인텐트 필터  |  Android 개발자  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

developer.android.com

 

728x90
반응형
반응형

Option Menu

 

 

1. Create Option menu 

Android Resource Directory

 

Resource type : menu -> Select OK

 

menu
Menu Resource File
File Name : test_menu -> OK

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

</menu>

 

 

 

 

2. Create Menu Item 

 

test_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/test_1"
        android:title="Test1">
    </item>

    <item
        android:id="@+id/test_2"
        android:title="Test2">
    </item>

    <item
        android:id="@+id/test_3"
        android:title="Test3">
    </item>
</menu>

 

MainActivity.java

code -> override methods

 

onCreateOptionsMenu

onCreate OptionsMenu method 생성  ( 직접 작성해도 됨 )

ackage com.example.project7_optionmenu;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
	
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
    }
}

 

코드 추가 ( xml, java 연결 )

...
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
		
        // 코드 추가
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.test_menu, menu);
		//
        return super.onCreateOptionsMenu(menu);
    }
...

 

 

2. Event 

onOptionsItemSelected

 

...
    // option menu event method
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId())
        {
            case R.id.test_1:
                Toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show();
            case R.id.test_2:
                Toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show();
            case R.id.test_3:
                Toast.makeText(getApplicationContext(), "Test3", Toast.LENGTH_LONG).show();
        }

        return super.onOptionsItemSelected(item);
    }
    ...

 

 

 

 

 

 

 

full main java code 

package com.example.project7_optionmenu;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.test_menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId())
        {
            case R.id.test_1:
                Toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show();
            case R.id.test_2:
                Toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show();
            case R.id.test_3:
                Toast.makeText(getApplicationContext(), "Test3", Toast.LENGTH_LONG).show();
        }

        return super.onOptionsItemSelected(item);
    }
}

 

developer.android.com/guide/topics/ui/menus?hl=ko

 

메뉴  |  Android 개발자  |  Android Developers

메뉴는 수많은 유형의 애플리케이션에서 사용되는 보편적인 사용자 인터페이스 구성 요소입니다. 친숙하고 일관적인 사용자 경험을 제공하기 위해 Menu API를 사용하여 활동에서 사용자 작업과

developer.android.com

 

 

728x90
반응형
반응형

xml

<?xml version="1.0" encoding="utf-8"?>
<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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <EditText
            android:id="@+id/Edit1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:hint="숫자1">
        </EditText>

        <EditText
            android:id="@+id/Edit2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:hint="숫자2">
        </EditText>

        <Button
            android:id="@+id/BtnAdd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:text="더하기"
            android:onClick="AddClick">

        </Button>

        <Button
            android:id="@+id/BtnSub"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:text="뺴기"
            android:onClick="SubClick">

        </Button>

        <Button
            android:id="@+id/BtnMulti"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:text="곱하기"
            android:onClick="MultiClick">

        </Button>

        <Button
            android:id="@+id/BtnDiv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:text="나누기"
            android:onClick="DivClick">

        </Button>

        <TextView
            android:id="@+id/TextResult"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30dp"
            android:textColor="#FF0000"
            android:text="계산 결과 : "
            >
        </TextView>


    </LinearLayout>


</LinearLayout>

java

package com.example.homework2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    EditText edit1, edit2;
    TextView textResult;
    String num1, num2, tmp;
    Integer result;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("간단한 계산기");


        edit1 = (EditText)findViewById(R.id.Edit1);
        edit2 = (EditText)findViewById(R.id.Edit2);

        textResult = (TextView)findViewById(R.id.TextResult);

    }

    // 덧셈 method
    public void AddClick(View target)
    {
        num1 = edit1.getText().toString();
        num2 = edit2.getText().toString();

        if ((isInteger(num1) & isInteger(num2))==1)
        {
            result = Integer.parseInt(num1) + Integer.parseInt(num2);
            tmp = "계산 결과 : " + result.toString();
            textResult.setText(tmp);
        }
        else
        {
            Toast.makeText(getApplicationContext(), "No Number", Toast.LENGTH_LONG).show();
        }

    }

    // 뺄셈 method
    public void SubClick(View target)
    {
        num1 = edit1.getText().toString();
        num2 = edit2.getText().toString();

        if ((isInteger(num1) & isInteger(num2))==1)
        {
            result = Integer.parseInt(num1) - Integer.parseInt(num2);
            tmp = "계산 결과 : " + result.toString();
            textResult.setText(tmp);
        }
        else
        {
            Toast.makeText(getApplicationContext(), "No Number", Toast.LENGTH_LONG).show();
        }
    }

    // 곱셈 method
    public void MultiClick(View target)
    {
        num1 = edit1.getText().toString();
        num2 = edit2.getText().toString();

        if ((isInteger(num1) & isInteger(num2))==1)
        {
            result = Integer.parseInt(num1) * Integer.parseInt(num2);
            tmp = "계산 결과 : " + result.toString();
            textResult.setText(tmp);
        }
        else
        {
            Toast.makeText(getApplicationContext(), "No Number", Toast.LENGTH_LONG).show();
        }
    }

    // 나눗셈 method
    public void DivClick(View target)
    {
        num1 = edit1.getText().toString();
        num2 = edit2.getText().toString();

        if ((isInteger(num1) & isInteger(num2))==1)
        {
            result = Integer.parseInt(num1) / Integer.parseInt(num2);
            tmp = "계산 결과 : " + result.toString();
            textResult.setText(tmp);
        }
        else
        {
            Toast.makeText(getApplicationContext(), "No Number", Toast.LENGTH_LONG).show();
        }
    }

    // integer type method
    static int isInteger(String s) {
        try {
            Integer.parseInt(s);
            return 1;
        } catch(NumberFormatException e) {
            return 0;
        }
    }

}

 

 

 

 

EditText

// EditText
EditText edit = (EditText)findViewById(R.id.Edit);

// return string 
edit.getText().toString();

 

 

TextView

// TextView
text = (TextView)findViewById(R.id.Text);

text.setText(edittext.getText());

 

 

developer.android.com/reference/android/widget/EditText

 

EditText  |  Android 개발자  |  Android Developers

 

developer.android.com

developer.android.com/reference/android/widget/TextView

 

TextView  |  Android 개발자  |  Android Developers

 

developer.android.com

 

728x90
반응형
반응형

LinearLayout 을 잘만 사용해도 어느 정도 디자인을 꾸밀 수 있다.

 

1. LinearLayout xml 생성

<LinearLayout xmlns : android = "http://schemas.android.com/apk/res/android"
   android : layout_width = "match_parent"
   android : layout_height = "match_parent"
   android : paddingLeft = "16dp"
   android : paddingRight = "16dp"
   android : orientation = "horizontal"
   android : gravity = "center">

   <!-여기에 다른 위젯 또는 레이아웃 태그를 포함합니다. 이것들은 고려됩니다
           선형 레이아웃의 "자식보기"또는 "자식"->

 </ LinearLayout>

 

XML attributes

 

 

2. LinearLayout 안에 LinearLayout 넣기

 

<?xml version="1.0" encoding="utf-8"?>
<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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="horizontal"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#FF0000">
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#0000FF">
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#008000">
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="3"
            android:background="#FFFF00"
            >
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:background="#0000FF"
            >
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="3"
            android:background="#008000"
            >
        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:text="Button1"
            />

        <ImageView
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/img">
        </ImageView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/txt1"
            android:layout_width="126dp"
            android:layout_height="match_parent"
            android:text="Hello"
            android:textColor="#FF0000"
            android:textSize="45dp">

        </TextView>

        <TextView
            android:id="@+id/txt2"
            android:layout_width="150dp"
            android:layout_height="match_parent"
            android:text="World"
            android:textColor="#0000FF"
            android:textSize="40dp">

        </TextView>

    </LinearLayout>
</LinearLayout>

 

developer.android.com/guide/topics/ui/layout/linear?hl=ko

 

선형 레이아웃  |  Android 개발자  |  Android Developers

LinearLayout은 세로 또는 가로의 단일 방향으로 모든 하위 요소를 정렬하는 뷰 그룹입니다. LinearLayout이 서로 스택된 상태에서 레이아웃 방향을 지정할 수 있기 때문에, 세로 목록에는 행 하나당 하

developer.android.com

 

728x90
반응형

+ Recent posts