만약 필드가(여기서는 예로 GD_SALE_ENDDT로 하겠다) varchar로 되어있는데 날짜형식으로 데이터를 저장하고 있다면

select의 경우 다음과 같이

update t_goods set WEIGHT=54, UPDATE_DT=UPDATE_DT where GD_SALE_ENDDT > CURRENT_TIMESTAMP()

로 해도 자동으로 현재시간이 varchar로 형변환 되서 비교하게 된다.

 

 

 

하지만 update의 경우

select wid, GD_SEQ, GD_NAME, WEIGHT, GD_SALE_ENDDT, UPDATE_DT from t_goods where GD_SALE_ENDDT > CURRENT_TIMESTAMP() 

이러식으로 하면

Data truncation: Truncated incorrect datetime value 이런 오류가 발생한다. 따라서

update t_goods set WEIGHT=54, UPDATE_DT=UPDATE_DT where GD_SALE_ENDDT > DATE_FORMAT(CURRENT_TIMESTAMP(), '%Y%m%d%H%i%s');

와 같이 DATA_FORMAT을 이용하여 명시적으로 형변환을 해줘야 오류없이 비교가 된다.

 

 

 

*보통 날짜 포맷에서

MM(월) mm(분) 으로 월과 분을 구별하는데

쿼리문에서는 %m(월), %i(분)로 구별한다.

'데이터베이스' 카테고리의 다른 글

쿼리 날짜 자동형변환  (0) 2020.05.13
git clone https://github.com/libgit2/libgit2 MyProject

해당 주소의 깃 저장소를 자신의 로컬의 MyProject라는 디렉토리를 만들고 거기에 복제한다.

 

git commit -a

Tracked상태의 모든 파일을 Staging Area로 자동으로 올리고 commit한다.(Untracked상태는 안됨) 

example) git commit -a -m "message"

 

git log -p

commit log를 diff의 내용도 포함해서 보여준다.

 

git log --all

모든 브랜치에 대해서 커밋 로그를 보여준다.

 

git log --oneline


commit log를 간략히 한 줄로 보여준다.

 

git log --pretty=format:"%h - %an, %ar : %s"

commit log를 지정한 format형식으로 보여준다.

result)

ca82a6d - Scott Chacon, 6 years ago : changed the version number

085bb3b - Scott Chacon, 6 years ago : removed unnecessary test

a11bef0 - Scott Chacon, 6 years ago : first commit

 

git log --author SearchName

 

저자의 이름이 SearchName을 포함하고 있는 commit log만 보여준다.

 

git log --grep SerachWord

commit message에 SearchWord를 포함 하는 log만 보여준다.  

 

git log -S SearchCode​

코드의 변경사항에 SearchCode를 포함하고 있는 commit log만 보여준다.

 

git log -- path1 path2​

변경된 파일이 path1 또는 path2를 포함하고 있는 commit log만 보여준다.

 

git commit --amend​

Staging Area에 있는 내용을 추가하여 마지막 커밋을 수정한다.(커밋 메세지도 수정 가능)

 

git remote -v​

원격 저장소의 단축이름과 주소를 보여준다.

 

git remote add A RemoteAddress

RomoteAddress의 원격 저장소를 A라는 이름으로 추가한다.

 

git fetch [remote-name]

remote-name의 원격 저장소에 있는 데이터를 가져온다. 자동으로 Merge하지 않는다.

 

git push origin master

master브랜치를  origin이라는 이름을 가진 원격 저장소에 Push한다. 단 원격 저장소에 현재 자신의 로컬상태 이후로 Push한 사람이 없어야 가능하다.

 

git remote show [remote-name]

해당 원격저장소의 URL과 추적하는 브랜치를 출력한다.

 

git tag -a [tag-name] -m [tag-message]​

해당 이름과 해당 메세지로 Annotated 태그를 만든다.

 

git tag [tag-name]

해당 이름으로 Lightweight 태그를 만든다.

 

git push [remote-name] [tag-name]

해당 원격저장소에 해당 태그를 푸시한다.(git push 명령어로는 태그를 push하지 않음)

 

git push [remote-name] --tags

로컬에 있는 모든 태그(들)을 푸시한다.

 

git checkout -b [branch-name] [tag-name]​

해당 tag에서 해당 이름으로 새로운 브랜치를 생성한다.

 

git branch -d [branch-name]

해당 브랜치를 삭제한다.

git push [remote-name] :[remote-branch-name]

해당 원격 저장소의 해당 브랜치를 삭제한다.

 

git fetch [remote-name] -p

 

원격 저장소의 삭제된 브랜치를 반영하여 패치한다.

'Git' 카테고리의 다른 글

Git 명령어 정리  (0) 2020.03.12

1. 이진탐색

1
2
3
4
5
6
7
8
while(start<=end){
 
    if(target==mid) break;
 
    if(target<mid) end=mid-1;
 
    else start=mid+1;
}
cs
 

2. Lower Bound : 원하는 값 이상이 처음 나오는 위치

1
2
3
4
5
6
7
8
9
while(start<end){
   
    if(target<=mid) end=mid ;
 
 
    else start=mid+1;
}
 
return end;
cs

 

3. Upper Bound : 원하는 값 초과한 값이 처음 나오는 위치 

1
2
3
4
5
6
7
8
9
while(start<end){
    
    if(target<mid) end=mid ;
 
    else start=mid+1;
}
 
return end ;
 
cs

 

'알고리즘(Algorithm) > 삼성 B형 준비' 카테고리의 다른 글

이분탐색  (0) 2019.12.22
최소힙(Min_Heap) 구현  (0) 2019.12.15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
struct Data {
    int a;
    int b;
 
    bool operator>(const Data& data) {
        return this->> data.b;
    }
};
 
struct Heap {
 
    Data data[300000];
 
    int k = 1;
 
    void init() {
        k = 1;
    }
 
    bool empty() {
        if (k == 1return true;
        return false;
    }
 
    void push(Data input) {
        int cur = k++;
        data[cur] = input;
        int par = cur / 2;
 
        while (1) {
            if (par == 0break;
            if (data[par] > data[cur]) {
 
                swap(data[par], data[cur]);
 
                cur = par;
                par = cur / 2;
            }
            else break;
        }
    }
 
    Data pop() {
 
        Data result = data[1];
        swap(data[1], data[k - 1]);
        k--;
 
        int cur = 1;
        while (1) {
            int child = cur * 2;
            if (child >= k) break;//자식이 없다면 종료
 
            if (child + 1 < k) {//오른쪽 자식이 존재한다면
                if (data[child] > data[child + 1]) child += 1;
            }
 
            if (data[cur] > data[child].) {
                swap(data[cur], data[child]);
                cur = child;
            }
            else break;
        }
 
        return result;
    }
};
cs

'알고리즘(Algorithm) > 삼성 B형 준비' 카테고리의 다른 글

이분탐색  (0) 2019.12.22
최소힙(Min_Heap) 구현  (0) 2019.12.15

MainActivity

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.example.boostcoursepractice;
 
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
 
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
 
import androidx.annotation.Nullable;
 
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
 
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
 
import java.io.File;
import java.net.URL;
import java.util.HashMap;
 
public class MainActivity extends AppCompatActivity {
 
    RecyclerView recyclerView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
 
        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
 
        final SingerAdapter adapter = new SingerAdapter(getApplicationContext());
 
        adapter.addItem(new SingerItem("소녀시대""010-2131-5133"));
        adapter.addItem(new SingerItem("티아라""010-2221-4353"));
        adapter.addItem(new SingerItem("여자친구""010-2134-2222"));
 
        adapter.setOnItemClickListener(new SingerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(SingerAdapter.ViewHolder holder, View view, int position) {
                SingerItem item = adapter.getItem(position);
 
                Toast.makeText(getApplicationContext(), "아이템 선택됨 : " + item.getName() + ", " + holder.textView2.getText().toString(), Toast.LENGTH_LONG).show();
            }
        });
 
        recyclerView.setAdapter(adapter);
 
 
    }
}
cs

 

SingerAdapter2(이게 더 맞는거 같음)

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package com.example.boostcoursepractice;
 
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
 
import androidx.annotation.LongDef;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
 
import java.util.ArrayList;
 
public class SingerAdapter extends RecyclerView.Adapter<SingerAdapter.ViewHolder> {
 
    Context context;
 
    ArrayList<SingerItem> items = new ArrayList<SingerItem>();
 
    OnItemClickListener listener;
 
    public interface OnItemClickListener {
        public void onItemClick(ViewHolder holder, View view, int position);
    }
 
    public SingerAdapter(Context context) {
        this.context = context;
    }
 
    @Override
    public int getItemCount() {
        return items.size();
    }
 
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.singer_item, parent, false);
 
        return new ViewHolder(itemView);
    }
 
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        SingerItem item = items.get(position);
        holder.setItem(item);
 
        holder.position = position;
    }
 
    public void addItem(SingerItem item) {
        items.add(item);
    }
 
    public void addItems(ArrayList<SingerItem> items) {
        this.items = items;
    }
 
    public SingerItem getItem(int position) {
        return items.get(position);
    }
 
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
 
    class ViewHolder extends RecyclerView.ViewHolder {
 
        TextView textView;
        TextView textView2;
        int position;
 
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
            textView2 = itemView.findViewById(R.id.textView2);
 
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (listener != null) {
                        Log.d("jjh""포지션 : " + position);
                        listener.onItemClick(ViewHolder.this, view, position);
                    }
                }
            });
        }
 
        public void setItem(SingerItem item) {
            textView.setText(item.getName());
            textView2.setText(item.getMobile());
        }
    }
}
 
cs

 

SingerAdapter

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.example.boostcoursepractice;
 
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
 
import androidx.annotation.LongDef;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
 
import java.util.ArrayList;
 
public class SingerAdapter extends RecyclerView.Adapter<SingerAdapter.ViewHolder>{
 
    Context context ;
 
    ArrayList<SingerItem> items = new ArrayList<SingerItem>();
 
    OnItemClickListener listener;
 
    int num = 0 ;
 
    public static interface OnItemClickListener{
        public void onItemClick(ViewHolder holder , View view, int position);
    }
 
    public SingerAdapter(Context context){
        this.context = context ;
    }
 
    @Override
    public int getItemCount() {
        return items.size();
    }
 
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.singer_item, parent, false);
 
        return new ViewHolder(itemView, num++);
    }
 
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        SingerItem item = items.get(position);
        holder.setItem(item);
 
        holder.setOnItemClickListener(listener);
    }
 
    public void addItem(SingerItem item){
        items.add(item);
    }
 
    public void addItems(ArrayList<SingerItem> items){
        this.items = items ;
    }
 
    public SingerItem getItem(int position){
        return items.get(position);
    }
 
    public void setOnItemClickListener(OnItemClickListener listener){
        this.listener = listener;
    }
 
    static class ViewHolder extends RecyclerView.ViewHolder{
 
        TextView textView;
        TextView textView2;
 
        OnItemClickListener listener ;
 
        public ViewHolder(@NonNull View itemView, final int position) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
            textView2 = itemView.findViewById(R.id.textView2);
 
            itemView.setOnClickListener(new View.OnClickListener() {
 
                @Override
                public void onClick(View view) {
                    if(listener != null){
                        Log.d("jjh","포지션 : " + position);
                        listener.onItemClick(ViewHolder.this, view, position);
                    }
                }
            });
        }
 
        public void setItem(SingerItem item){
            textView.setText(item.getName());
            textView2.setText(item.getMobile());
        }
 
        public void setOnItemClickListener(OnItemClickListener listener){
            this.listener = listener;
        }
 
    }
}
 
cs

 

SingerItem

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.example.boostcoursepractice;
 
public class SingerItem {
 
    private String name ;
    private String mobile;
 
    public SingerItem(String name, String mobile) {
        this.name = name;
        this.mobile = mobile;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getMobile() {
        return mobile;
    }
 
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
}
 
cs

 

activity_main.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />
 
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></androidx.recyclerview.widget.RecyclerView>
 
</LinearLayout>
cs

 

singer_item.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="이름"
        android:textColor="@color/colorAccent"
        android:textSize="30dp" />
 
    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="전화번호"
        android:textColor="@color/design_default_color_primary"
        android:textSize="20dp" />
</LinearLayout>
cs

 

우선 리싸이클러뷰는 리스트뷰를 만드는 것과 비슷하다. 하지만 여기에 뷰홀더라는 개념이 추가가 된다. 뷰홀더는 그냥 아이템 하나를 가지고 있는 클래스라고 생각하면 된다. 그리고 그 아이템을 가지고 있는 뷰홀더가 모여 어댑터가 되고 그 어댑터를 리싸이클뷰에 추가하면 완료된다. 우선 아이템의 레이아웃인 singer_item.xml 만들고 아이템의 데이터인 SingerItem 자바 클래스를 만들어 준다.(리스트뷰와 동일) 그 다음은 리싸이클뷰 어댑터를 만들어 준다 여기서는 SingerAdapter라고 만들어 주었다. 어댑터의 코드를 보면 

 

 @NonNull

    @Override

    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView = inflater.inflate(R.layout.singer_item, parent, false);

 

        return new ViewHolder(itemView, num++);

    }

 

    @Override

    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        SingerItem item = items.get(position);

        holder.setItem(item);

 

        holder.setOnItemClickListener(listener);

    }

 

이런 코드가 있는데 onCreateViewHolder라는 콜백함수는 뷰홀더가 만들어 질 때 호출되는데 여기서 아까 만들어준 singer_item.xml을 인플레이션해주고 홀더 인스턴스 안에 넣어 리턴해준다. onBindViewHolder는 뷰와 홀더가 바인드 될 때 실행되는 함수로 여기에서 setItem으로 뷰 안에 여러 뷰들을 설정해준다. 이렇게 하고 다시 MainActivity로 돌아와 리사이클러뷰에 어댑터를 설정해 주면 되는데 그전에 

 

recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

 

        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

        recyclerView.setLayoutManager(layoutManager);

 

위 처럼 레이아웃매너저를 만들어 리싸이클러뷰에 설정해 주어야 한다.

 

마지막으로 아이템이 클릭 되었을 때의 리스너는 따로 구현되어 있지 않기 때문에 직접 만들어주어야 한다. 여기에서는 어댑터 클래스에 구현해 주었다. 

 

 

 

결과화면

 

MainActivity

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
package com.example.boostcoursepractice;
 
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
 
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
 
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;
 
import java.io.File;
import java.net.URL;
import java.util.HashMap;
 
public class MainActivity extends AppCompatActivity {
 
    MediaRecorder recorder;
    String filename;
 
    MediaPlayer player;
    int position = 0;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        File sdcard = Environment.getExternalStorageDirectory();
        File file = new File(sdcard, "recorded.mp4");
        filename = file.getAbsolutePath();
        Log.d("MainActivity""저장할 파일명 : " + filename);
 
        Button button = (Button) findViewById(R.id.button);
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                palyAudio();
            }
        });
 
 
        Button button2 = (Button) findViewById(R.id.button2);
 
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                pauseAudio();
            }
        });
 
        Button button3 = (Button) findViewById(R.id.button3);
 
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                resumeAudio();
            }
        });
 
        Button button4 = (Button) findViewById(R.id.button4);
 
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stopAudio();
            }
        });
 
        Button button5 = (Button) findViewById(R.id.button5);
 
        button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                recordAudio();
            }
        });
 
        Button button6 = (Button) findViewById(R.id.button6);
 
        button6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stopRecording();
            }
        });
    }
 
    public void palyAudio() {
        try {
            closePlayer();
 
            player = new MediaPlayer();
            player.setDataSource(filename);
            player.prepare();
            player.start();
 
            Toast.makeText(this"재생 시작됨", Toast.LENGTH_LONG).show();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public void pauseAudio() {
        if (player != null && player.isPlaying()) {
            position = player.getCurrentPosition();
            player.pause();
 
            Toast.makeText(this"일시 정지지됨", Toast.LENGTH_LONG).show();
        }
    }
 
    public void resumeAudio() {
        if (player != null && !player.isPlaying()) {
            player.seekTo(position);
            player.start();
 
            Toast.makeText(this"재시작됨", Toast.LENGTH_LONG).show();
        }
    }
 
    public void stopAudio() {
        if (player != null && player.isPlaying()) {
            player.stop();
 
            Toast.makeText(this"중지됨", Toast.LENGTH_LONG).show();
        }
    }
 
    public void closePlayer() {
        if (player != null) {
            player.release();
            player = null;
        }
    }
 
    public void recordAudio() {
        recorder = new MediaRecorder();
 
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
 
        recorder.setOutputFile(filename);
 
        try {
            recorder.prepare();
            recorder.start();
 
            Toast.makeText(this"녹음 시작됨", Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public void stopRecording(){
        if(recorder != null){
            recorder.stop();
            recorder.release();
            recorder = null ;
 
            Toast.makeText(this"녹음 중지됨", Toast.LENGTH_LONG).show();
        }
    }
}
 
cs

 

activity_main.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <Button
        android:id="@+id/button5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="녹음시작" />
 
    <Button
        android:id="@+id/button6"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="녹음중지" />
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="재생" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="일시정지" />
 
    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="재시작" />
 
    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="정지" />
</LinearLayout>
cs

 

기존에 진행 했던 '7-2-1 음악 재생하기'에서 좀 더 확장하여 구현하였다.  항상 종료가 될 때는 아래처럼

 

recorder.stop();

            recorder.release();

            recorder = null ;

 

자원을 해제하는 것을 잊지 말자

 

결과화면

 

MainActivity

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.example.boostcoursepractice;
 
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
 
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
 
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;
 
import java.io.File;
import java.net.URL;
import java.util.HashMap;
 
public class MainActivity extends AppCompatActivity {
 
    VideoView videoView;
 
    public static String url = "http://sites.google.com/site/ubiaccessmobile/sample_video.mp4";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        videoView = (VideoView) findViewById(R.id.videoView);
 
        MediaController mediaController = new MediaController(this);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(Uri.parse(url));
        videoView.requestFocus();
 
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                Toast.makeText(getApplicationContext(), "동영상 준비됨.", Toast.LENGTH_LONG).show();
            }
        });
 
        Button button = (Button) findViewById(R.id.button);
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                videoView.seekTo(0);
                videoView.start();
            }
        });
 
    }
}
cs

 

activity_main.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
 
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="시작" />
 
    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
 
cs

 

동영상 재생은 일단 위 코드처럼 하면 된다. 이때 부연설명을 하자면 아래의 코드처럼

 

 videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

            @Override

            public void onPrepared(MediaPlayer mediaPlayer) {

                Toast.makeText(getApplicationContext(), "동영상 준비됨.", Toast.LENGTH_LONG).show();

            }

        });

 

비디오뷰에 setOnPreparedListener로 onPrepared메서드를 오버라이드한 OnPreparedListener를 설정한다면 requestFocus로 시작하여 비디오 재생 준비가 끝나면 onPrepared메서드가 호출되어 준비종료가 됬다는 것을 알수 있다. 그 이후로 동영상을 재생시켜주면 된다.

 

 

결과화면

 

MainActivity

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package com.example.boostcoursepractice;
 
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
 
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
 
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
 
import java.io.File;
import java.net.URL;
import java.util.HashMap;
 
public class MainActivity extends AppCompatActivity {
 
    public static String url = "http://sites.google.com/site/ubiaccessmobile/sample_audio.amr";
 
    MediaPlayer player;
    int position = 0;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button button = (Button) findViewById(R.id.button);
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                palyAudio();
            }
        });
 
 
        Button button2 = (Button) findViewById(R.id.button2);
 
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                pauseAudio();
            }
        });
 
        Button button3 = (Button) findViewById(R.id.button3);
 
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                resumeAudio();
            }
        });
 
        Button button4 = (Button) findViewById(R.id.button4);
 
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stopAudio();
            }
        });
 
 
    }
 
    public void palyAudio() {
        try {
            closePlayer();
 
            player = new MediaPlayer();
            player.setDataSource(url);
            player.prepare();
            player.start();
 
            Toast.makeText(this"재생 시작됨", Toast.LENGTH_LONG).show();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public void pauseAudio()
    {
        if(player != null && player.isPlaying()){
            position = player.getCurrentPosition();
            player.pause();
 
            Toast.makeText(this"일시 정지지됨",Toast.LENGTH_LONG).show();
        }
    }
 
    public void resumeAudio()
    {
        if(player != null && !player.isPlaying()){
            player.seekTo(position);
            player.start();
 
            Toast.makeText(this"재시작됨",Toast.LENGTH_LONG).show();
        }
    }
 
    public void stopAudio()
    {
        if(player != null && player.isPlaying()){
            player.stop();
 
            Toast.makeText(this"중지됨",Toast.LENGTH_LONG).show();
        }
    }
 
        public void closePlayer(){
            if(player != null){
                player.release();
                player = null ;
            }
    }
}
cs

 

activity_main.xml

...더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="재생" />
 
    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="일시정지" />
 
    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="재시작" />
 
    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="정지" />
</LinearLayout>
 
cs

 

음악을 재생하기 위해서는 MediaPlayer를 이용하면 된다. 

 

구현은 위 코드대로 하면 되고 중요한 것은 스피커는 하나의 자원이기 때문에 항상 다 쓰고 나면 아래처럼

 

 if(player != null){

                player.release();

                player = null ;

            }

 

해제를 해줘야 한다.

 

 

결과화면

 

 

+ Recent posts