반응형

오랜만에 포스팅을 하게 됬습니다 ㅋㅋ (요즘 일에 계속 치여서...)

 

무튼...

 

요즘 음성명령으로 피드백을 받는 구글 어시스턴트(링크 : 구글 어시스턴트 앱정보)라는 어플을 많이 보셨을껍니다.

이걸 사용하려 했더니 자료가 어려운거 같아 나름대로 정리를 해봅니다.

 

처음 시작하시는 분들은 도움이 되시길 바라면서 ㅎㅎ 시작할께요 ㅎㅎ 

 

반응형

 

 


 

구글 어시스턴트처럼 음성 처리를 하기위한 방식을 적용해야 합니다.

그런 방식을 처리하기위해 Google Actions을 바로 사용할 수도 있지만 사용하기엔 난해할 수 있습니다.

https://developers.google.com/assistant

 

Google Assistant  |  Google Developers

The developer platform for the Google Assistant.

developers.google.com

 

그래서 지원하는게 바로 DialogFlow!!!

 

이 DialogFlow 부터 천천히 알아가보도록 합시다.

 

순서는 간략하게 아래와 같음

1. DialogFlow Agent 생성 : (지금여기임)
2. 사용자 음성을 구분 할 Entitles 입력
3. 사용자 음성을 받은 뒤 처리 동작을 위한 Intent 입력
4. 기본동작 확인(여기까지면 기본동작은 함)
5. Response를 기본동작이 아닌 코드로 작성 가능한 Fulfillment 작성1 : Inline Edit
6. Response를 기본동작이 아닌 코드로 작성 가능한 Fulfillment 작성2 : Webhook

 

일단 Agent 생성부터 진행하도록 합시다~!!

 

1. DialogFlow 접속

https://dialogflow.cloud.google.com/#/getStarted

 

Dialogflow

Updating Actions on Google...

dialogflow.cloud.google.com

DialogFlow 초기접속화면

설명을 위해 반말로 하겠습니다. 양해 부탁드려요^^;; ㅎㅎ 

 

해당 페이지에 접속하면 첫페이지는!!! 당연히 아무것도 없다 ㅋㅋㅋ 

여기서 우린 Agent 를 생성할꺼임

 

Agent 는 프로젝트라고 생각하면 편함ㅎㅎ 

 

좌측 Create Agent 를 클릭~!! 

Create Agent 화면

 

Agent 이름을 적당히 정해주시고 ㅎㅎ (전 DialogFlow-Test라고 정했음)

Default Language(기본언어)는 클릭 후 한국어로 변경해 주고

GoogleProject 는 생성하는걸로 정해주시고 ㅎㅎ

 

CREATE 클릭~!!

그러면 WORKING 으로 바뀌면서 열심히 생성을 할꺼임 ㅎㅎ (시간이 좀 걸림)

 

이거 되는거 맞아? 렉걸리거 아니야? 라고 생각될 때 쯤~~~~~ 화면이 쨔잔~!!!

 

해당 화면이 나오면 Agent 는 정상생성 된것임 ㅎㅎ 

시험삼아 동작확인을 한번 해볼까??

 

우측에 'Try it now' 클릭 후 '안녕' 을 입력해보자 ㅎㅎㅎ 

그러면 아래처럼 쨔잔~~~~

 

'안녕' 단어에 대한 Response 처리 결과

 

Response 로 '안녕하세요!' 가 출력됨을 볼 수 있다 ㅎㅎㅎ 

간단한 동작시험은 여기서 할 수 있음 ㅎㅎ 

 

Agent 생성이 됬으니 이제 우리가 설정하고 싶은 단어를 처리하기위해 속성값들을 넣어줘야 한다 ㅎㅎ 

이건 다음편에서 정리하도록 하겠음 ㅎㅎ 

 

SMALL

 

반응형
반응형

안드로이드 코드를 작성하다보면

android.view.WindowManager$BadTokenException

위 같은 BadTokenException 유형의 에러가 확인될 때가 있다.

 

해당 문제에 대하여 원인파악 및 조치방안을 확인해보자

 

 

일단 위치를 확인하면 WindowManager 아래에 있는 함수다.

 

그럼 WindowManager 는 어떤건가?

[공식문서]

 

WindowManager  |  Android 개발자  |  Android Developers

WindowManager Jetpack WindowManager 라이브러리를 사용하면 애플리케이션 개발자가 새로운 기기 폼 팩터와 멀티 윈도우 환경을 지원할 수 있습니다. 라이브러리는 API 버전 14 이상에서 공통 API 노출 영역

developer.android.com

 

간단하게는 화면 표출에 관련된 함수다.. 그럼 왜 BadTokenException 이 발생하는걸까??

 

화면에 출력을 해줄려고 했는데 !! 

해당 Activity 가 동작하지 않는 경우에 발생한다!!!

반응형

 

그럼 심플하게 생각하면 

 

해당 Activity 가 동작중인지 체크만 추가해주면? ㅎㅎ 해결된다.

 

어떻게??

 

아래처럼 ㅎㅎ 

Activity.this.isFinishing() 조건식을 확인해보면 가능!! 

try {
    // Activity 동작 확인 조건식 추가
    if(!Activity_Connect.this.isFinishing()) {
        TextView tv = new TextView((Activity) CurrentOBJ);
        tv.setText("Dialog 타이틀");
        tv.setTextColor(0xFFFF8000);
        tv.setPadding(70, 50, 20, 30);
        tv.setTextSize(20F);
        AlertDialog.Builder builder = new AlertDialog.Builder((Activity) CurrentOBJ);
        builder.setCustomTitle(tv)
                .setMessage("본문 내용")
                .setPositiveButton("확인",
                        (dialog, which) -> {
                            //확인 클릭 시 동작 처리
                        })
                .setNegativeButton("취소",
                        (dialog, which) -> {
                            //취소 클릭 시 동작 처리
                        })
                .setCancelable(false)
                .show();
    }
}catch (WindowManager.BadTokenException e){
    e.printStackTrace();
}
SMALL

조건식으로 확인 후 동작하게되면 에러는 사라지게 됨 ㅎㅎ 

 

간단한 예외처리 완료 ㅎㅎ 

반응형
반응형

오늘은 간단하게 사용 가능한 파일이동 함수를 알아보겠음... 

 

A 위치에서 B 위치고 파일을 이동시키고 싶을 때 미디어파일이나 기타등등 파일이동을 시키고 싶은 때 간단하게 사용가능한 함수를 공유합니다

반응형

Function : MOVE_FILE

    /**
     * @param context : Context
     * @param inputPath : 원본 파일 Path 
     * @param inputFile : 원본 파일 이름
     * @param outputPath : 옮길 폴더 경로
     */
    public static void MOVE_FILE(Context context, String inputPath, String inputFile, String outputPath){
        InputStream in = null;
        OutputStream out = null;
        try{
            File dir = new File(outputPath);
            Log.e("dir", dir.getPath());
            if(!dir.exists()){
                dir.mkdirs();
            }

            Log.e("MOVE_FILE", outputPath + "/" + inputFile + "______" + dir.getPath());

            in = new FileInputStream(inputPath + inputFile);
            out = new FileOutputStream(outputPath + "/" + inputFile);

            byte[] buffer = new byte[1024];
            int read;
            while((read = in.read(buffer)) != -1){
                out.write(buffer, 0, read);
            }
            in.close();
            in = null;

            out.flush();
            out.close();
            out = null;

            // 기존 원본파일 삭제
            new File(inputPath + inputFile).delete();
            
            // 파일 미디어 동기화 , 사진 혹은 동영상 파일 갤러리 동기화
            File tmp_file = new File(outputPath + "/" + inputFile);
            context.sendBroadcast(new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(tmp_file)) );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
SMALL

아시는 분은 아시겠지만 사용법은 간단합니다.

 

파라미터 설명
inputPath  원본파일 Path
inputFile  원본파일 이름
outputPath  이동할 폴더 경로

 

해당 파라미터에 대한 값을 입력 후 동작시키면 원본파일은 이동할 폴더에 원본 파일명으로 생성된 뒤 원본파일은 삭제처리 됨... ㅎㅎ 

 

 

반응형
반응형

오늘은 삽질을 하다가 찾아낸 방법을 공유하려고 씁니다

 

진짜 ㅋㅋㅋ 내용들때문에 진짜 삽질을 어마어마하게 했네요 ㅋㅋㅋㅋ 

(인터넷도 잘 서핑을 해야됨 진짜... ㅋㅋ )

 

 

자 간단하게 먼저 설명 시작!!

 

일단 안드로이드 API29 즉 안드로이드 10버전 부터는 저장소 접근 방식이 변경되어 이전 방식처럼 바로 접근은 불가함

 

 

파일 Read/Write

Android 9 이하 (API 28 이하) Permission 획득 후 접근 가능
- WRITE_EXTERNAL_STORAGE
- READ_EXTERNAL_STORAGE
Android 10 이상 (API 29 이상) Scoped storage 정책 적용

Android 10 에서는 예외사항으로 속성값 적용 시 9버전처럼 사용가능(Target Build SDK가 29일 경우, 30일 경우는 해당 속성값 무시)
-> <application
      ....
      // 아래부분 추가
      android:requestLegacyExternalStorage="true"
    >

Private 영역은 권한 요청없이 생성, 삭제 가능
Public 영역은 MediaStore 함수를 이용하여 생성, 삭제 등 가능
반응형

 

일단 Storage Scope 에 대한 내용은 아래 링크 참조바랍니다.

[구글 공식내용]

 

Android 11의 저장소 업데이트  |  Android 개발자  |  Android Developers

Android 11의 저장소 업데이트 Android 11(API 수준 30)에서는 플랫폼을 한층 더 강화하여 외부 저장소의 앱 및 사용자 데이터를 더욱 안전하게 보호합니다. 이 버전에는 미디어의 원시 파일 경로 액세

developer.android.com

 

 

자 그러면 Private 영역, Public 영역은 뭐가 있는지 봅시다

 

이때까진 

// 루트경로
String path = Environment.getExternalStorageDirectory().getPath();

위 처럼 루트 경로에서 "패키지명" 폴더 를 만들어서 작업을 많이 했다면.... 이젠 불가....

 

공용 폴더 Path 정리

//공용 DCIM 폴더
String DCIM_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM).getPath();

//공용 다운로드 폴더
String Download_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).getPath();

//공용 음악 폴더
String Music_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_MUSIC).getPath();

//공용 팟캐스트 폴더
String Podcast_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_PODCASTS).getPath();

//공용 벨소리 폴더
String Ring_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_RINGTONES).getPath();

//공용 알람 폴더
String Alarm_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_ALARMS).getPath();

//공용 알림음 폴더
String Noti_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_NOTIFICATIONS).getPath();

//공용 사진 폴더
String Picture_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES).getPath();

//공용 영상 폴더
String Movie_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_MOVIES).getPath();

//공용 문서 폴더
String Document_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getPath();

//공용 스크린샷 폴더
String Screenshot_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_SCREENSHOTS).getPath();

//공용 오디오북 폴더
String Audio_Path = Environment.getExternalStoragePublicDirectory(DIRECTORY_AUDIOBOOKS).getPath();

 

Private 영역 Path 정리

// 내부폴더 Path : /Android/data/패키지명/files/

//내부 DCIM 폴더
String DCIM_Path = context.getExternalFilesDir(DIRECTORY_DCIM).getPath();

//내부 다운로드 폴더
String Download_Path = context.getExternalFilesDir(DIRECTORY_DOWNLOADS).getPath();

//내부 음악 폴더
String Music_Path = context.getExternalFilesDir(DIRECTORY_MUSIC).getPath();

//내부 팟캐스트 폴더
String Podcast_Path = context.getExternalFilesDir(DIRECTORY_PODCASTS).getPath();

//내부 벨소리 폴더
String Ring_Path = context.getExternalFilesDir(DIRECTORY_RINGTONES).getPath();

//내부 알람 폴더
String Alarm_Path = context.getExternalFilesDir(DIRECTORY_ALARMS).getPath();

//내부 알림음 폴더
String Noti_Path = context.getExternalFilesDir(DIRECTORY_NOTIFICATIONS).getPath();

//내부 사진 폴더
String Picture_Path = context.getExternalFilesDir(DIRECTORY_PICTURES).getPath();

//내부 영상 폴더
String Movie_Path = context.getExternalFilesDir(DIRECTORY_MOVIES).getPath();

//내부 문서 폴더
String Document_Path = context.getExternalFilesDir(DIRECTORY_DOCUMENTS).getPath();

//내부 스크린샷 폴더
String Screenshot_Path = context.getExternalFilesDir(DIRECTORY_SCREENSHOTS).getPath();

//내부 오디오북 폴더
String Audio_Path = context.getExternalFilesDir(DIRECTORY_AUDIOBOOKS).getPath();

 

내부폴더를 생성하고 사진, 영상 파일 생성 후 갤러리에 표출하기위해 

// 특정 사진을 갤러리에 동기화
sendBroadcast(new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)) );

동기화를 실행.... 그러나 실패....

 

왜????  Private 영역은 애시당초 Android 폴더 내에 .nomedia 라는 파일이 자동생성 되어있어 갤러리에 동기화가 되질 않는다....하아.... 

 

그래서 DCIM 폴더에 파일을 옮겨야 하는 일이 생겼는데... 

 

그런데... 여기서 공용 폴더에 파일을 옮기려고 했더니 문제가 생겼다.

 

 

 

그냥 옮기면 안되고 MediaStore 함수를 이용하여 보내야 하는 상황이 발생!!!

 

ㅋㅋㅋㅋㅋ 그럼 MediaStore 를 또 알아봐야함 ㅋㅋ 끝이없네 ㅋㅋ 

 

간단하게 함수먼저 똭!!

 

사진파일 이동

   /**
     * @param context : Context
     * @param file : 원본 파일 정보
     * @param SavePath : 옮길 폴더 디렉토리  (ex : DCIM/TEST/사진저장)
     */
    public static void ImageFileMove(Context context, File file, String SavePath){
        try {
            Log.e("ImageFileMove", file.getName());
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.TITLE, file.getName());
                values.put(MediaStore.Images.Media.DISPLAY_NAME, file.getName());
                values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
                values.put(MediaStore.Images.Media.RELATIVE_PATH, SavePath);
                values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");

                Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                OutputStream fos = context.getContentResolver().openOutputStream(uri);

                Bitmap bmp = BitmapFactory.decodeFile(file.getPath() );
                bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);

                fos.flush();
                fos.close();
            } else {
                String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString() + File.separator + SavePath;
                File dir_file = new File(dir);
                if(!dir_file.exists()){
                    dir_file.mkdirs();
                }

                File imgfile = new File(dir_file, file.getName());
                FileOutputStream os = new FileOutputStream(imgfile);
                Bitmap bmp = BitmapFactory.decodeFile(file.getPath() );
                bmp.compress(Bitmap.CompressFormat.JPEG, 100, os);
                os.flush();
                os.close();

                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.TITLE, file.getName());
                values.put(MediaStore.Images.Media.DISPLAY_NAME, file.getName());
                values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
                values.put(MediaStore.Images.Media.BUCKET_ID, file.getName());
                values.put(MediaStore.Images.Media.DATA, imgfile.getAbsolutePath());
                values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");

                context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

 

이거면 로컬에 생성한 사진파일을 DCIM 에 특정폴더로 이동하여 갤러리에 갱신시킬 수 있다 ㅎㅎ 

설명은 편하게 툭툭 쓰지만 삽질을 쫌 했음.... 후우.... 

 

속성값 중에 특히 중요한건 아래내용이다.

속성값 설명
DISPLAY_NAME 저장할 파일 이름
DATE_TAKEN 파일생성 시간
DATA 원본파일 정보
MIME_TYPE 파일 저장 형식
RELATIVE_PATH 저장할 폴더 경로

 

위에 함수를 사용하면 사진파일 이동은 별 문제 없이 가능할 것이다.

 

그럼....영상파일 이동은?!!

 

함수 또 나옵니다~~~~

 

영상파일 이동

    /**
     * @param context : Context
     * @param file : 원본 파일 정보
     * @param SavePath : 옮길 폴더 디렉토리  (ex : DCIM/TEST/영상저장)
     */
    public static void VideoFileMove(Context context, File file, String SavePath){
        try {
            Log.e("VideoFileMove", file.getName());
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                ContentValues values = new ContentValues();
                values.put(MediaStore.Video.Media.TITLE, file.getName());
                values.put(MediaStore.Video.Media.DISPLAY_NAME, file.getName());
                values.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
                values.put(MediaStore.Video.Media.RELATIVE_PATH, SavePath);
                values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");

                Uri uri = context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
                ParcelFileDescriptor pdf = context.getContentResolver().openFileDescriptor(uri, "w", null);
                if(pdf == null){
                    Log.e("asdf", "null");
                }
                else{
                    FileOutputStream fos = new FileOutputStream(pdf.getFileDescriptor());
                    fos.write(FileUtils.readFileToByteArray(file));
                    fos.close();
                    pdf.close();
                    context.getContentResolver().update(uri, values, null, null);
                }
            } else {
                MOVE_FILE(context, MP4_Path, file.getName(), MP4_Path_orig);
            }
            Sub_FileDelete(file, 81);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void MOVE_FILE(Context context, String inputPath, String inputFile, String outputPath){
        InputStream in = null;
        OutputStream out = null;
        try{
            File dir = new File(outputPath);
            Log.e("dir", dir.getPath());
            if(!dir.exists()){
                dir.mkdirs();
            }

            Log.e("MOVE_FILE", outputPath + "/" + inputFile + "______" + dir.getPath());

            in = new FileInputStream(inputPath + inputFile);
            out = new FileOutputStream(outputPath + "/" + inputFile);

            byte[] buffer = new byte[1024];
            int read;
            while((read = in.read(buffer)) != -1){
                out.write(buffer, 0, read);
            }
            in.close();
            in = null;

            out.flush();
            out.close();
            out = null;

            new File(inputPath + inputFile).delete();

            File tmp_file = new File(outputPath + "/" + inputFile);
            context.sendBroadcast(new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(tmp_file)) );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
SMALL

 

이러면 영상파일 이동도 완료 ㅎㅎㅎ 

 

기본적인 내용은 사진 이동하고 비슷함 ㅎㅎ 

 

안드로이드 8, 9, 10, 11 까지 시험 진행 완료된 함수이니 사용해도 무방할 것임 ㅎㅎ 

 

 

 

여기까지 하고 나니 DCIM 폴더에 저장한 사진 리스트를 받아와서 삭제해야하는 경우가 생김!!!

(산넘어 산.... 역시 가볍게 끝내주질 않음....)

 

그래서 DCIM 폴더에 접근해서 전체 파일 정보를 읽어오는

File dir = new File(path);
File[] fileList = dir.listFiles();

했지만... 결과는 Null !!!!!!! 왜?!!! 

 

그럼 아래처럼 파일 존재 확인은???

File file = new File(path);
Log.e("file", "Result : " + file.exists());

가능하다.... 

 

음.... 그래서 다시 검색 시작.....

근데 거의 대다수 사이트에서 똑같이 말하는 내용이 있다.....

아래처럼 WRITE_EXTERNAL_STORAGE Permission 에서 maxSdkVersion 을 28로 설정하라고.....

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28"/>

 

아래처럼 maxSdkVersion 을 29로 설정하면 10버전에서 파일 리스트 호출이 정상적으로 동작함.....

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="29"/>

 

누구냐 도대체.... 28로 설정하라해서 삽질하게 만든 사람들은.....하아.....

 

오늘의 삽질은 여기까지.... ㅎㅎ 

 

다 필요한 함수는 아니겠지만 누군가에겐 도움이 되길 바라면서 오늘도 이만 ㅎㅎ 

반응형
반응형

JAVA 는 기본적으로 C 에서 사용하는 Struct 라는 구조체는 존재하지 않음...

 

근데 구조체처럼 관리가 필요한 경우가 있음

 

그때 사용하는 방법을 요약해서 공유드립니다.

 

일단 Java 니깐 클래스를 하나 생성!! 

 

[구조체 클래스 : ST_LIST_File]

public class ST_LIST_File {
    // 사용 인자 선언
    private boolean f_exist;
    private final String filetype;
    private final String orig_filename;
    private final String date;
    private final String time;
    private final String mode;
    private final String type;
    private final String frame;
    private final String size;
    private final String makeTime;

    // 내용 삽입을 위한 Public 클래스 선언
    public ST_LIST_File(String filetype, String orig_filename, String date, String time, String mode, String type, String frame, String size, String makeTime, boolean f_exist){
        this.filetype = filetype;
        this.orig_filename = orig_filename;
        this.date = date;
        this.time = time;
        this.mode = mode;
        this.type = type;
        this.frame = frame;
        this.size = size;
        this.makeTime = makeTime;
        this.f_exist = f_exist;
    }

    // 값 호출
    public String get_filetype(){
        return this.filetype;
    }
    public String get_orig_filename(){
        return this.orig_filename;
    }
    public String get_date(){
        return this.date;
    }
    public String get_time(){
        return this.time;
    }
    public String get_mode(){
        return this.mode;
    }
    public String get_type(){
        return this.type;
    }
    public String get_frame(){
        return this.frame;
    }
    public String get_size(){
        return this.size;
    }
    public String get_makeTime(){
        return this.makeTime;
    }
    public boolean get_f_exist(){
        return this.f_exist;
    }
    public void set_f_exist(boolean flag){
        this.f_exist = flag;
    }
}
반응형

클래스 명은 원하는데로 지정 

 

 

해당 클래스로는 일단 1개 정보밖에 저장이 안됨...

 

그래서!!!

 

// 구조체 ArrayList 선언
ArrayList<ST_LIST_File> ST_TEST = new ArrayList<>();

 

위 처럼 ArrayList 를 사용하여 해당 구조체 클래스를 ArrayList로 선언!!

 

이제 데이터를 삽입해야 함

 

ArrayList 삽입하는 방식과 똑같음

SMALL
// 데이터 구조에 맞춰 선언
ST_LIST_File tmp = new ST_LIST_File(
        "데이터1",
        "데이터2",
        "데이터3",
        "데이터4",
        "데이터5",
        "데이터6",
        "데이터7",
        "데이터8",
        "데이터9",
        "데이터10");

// ArrayList 에 자료 삽입
ST_TEST.add(tmp);

이렇게 선언 후 데이터 삽입을 하면 저장은 완료 ㅎㅎ 

 

 

사용은 어떻게???

 

for(int i = 0 ; i < ST_TEST.size() ; i++){
	// 구조체 클래스에 선언한 호출함수로 해당 값을 호출
	Log.d("Result", ST_TEST.get(i).get_date());
}

 

이렇게 사용하면 심플하게 사용 ㅎㅎ 

 

너무 어렵게 생각하지 말고 모두들 즐코딩 ㅎㅎ 

반응형

+ Recent posts