Notice
Recent Posts
Recent Comments
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 등산로조성
- 안드로이드
- 안드로이드#코틀린#디자인패턴#싱글턴패턴#개발#앱개발
- 알고리즘
- bitmasking
- MVVM
- Higher-Order
- 삼성파우치
- 자바
- 탐탁노트북파우치
- Kotlin
- kotiln
- 비트마스킹
- 코딩테스트
- 코틀린
- lateinit
- Java
- nullalble
- 아키텍처패턴
- 삼성청년sw아카데미
- #충무로맛집#골목식당#스테이크#
- Android
- 탐탁삼성파우치
- 백준
- ssafy서울
- 싸피
- 삼성역량테스트
- DataBinding
- tomtoc
- 투포인터
Archives
공상하는 개발자
[안드로이드/android] 이미지 호스팅을 통한 url로 이미지 받아오기 본문
반응형
내가 만들 타임라인은 사진이 무엇보다 중요하다. 솔직히 페이스북이나 인스타그램 같은 경우도 사진이 전부다.
그런데 이러한 사진들을 앱상에 집어넣게 되면 용량이 엄청 커지고 받아오는 데에도 시간이 오래 걸려서 다른 방법을 찾다가 이미지 호스팅을 이용해서 이 url을 통해서 이미지를 받아오면 빠르고 간결하게 이미지를 받을 수 있겠다 라는 생각을 하게 되었다. 그래서 이미지 호스팅을 찾는데 거의 다 유료라서 유료를 결제해야 하나 라는 생각에 잠겨있을 때 dothome이라는 유명한 웹호스팅 사이트를 찾게 되었다. 여기서 무료로 도메인을 하나 받고 파일을 ftp을 통해서 올릴 수 있었는데 여기다가 이미지를 올리고 url을 생성해서 받아오겠다는 생각을 하였다.
Fragment_Post.java
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
191
192
193
194
195
|
public class Fragment_Post extends Fragment{
private Button add_img,cc;
private File tempFile;
private ImageView imageView1;
private EditText postcontent;
private static final int PICK_FROM_ALBUM = 1;
private static String temp="";
public static String imagepath;
public static int text;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_post,container,false);
imageView1 = view.findViewById(R.id.post_image);
postcontent=view.findViewById(R.id.post_edit);
add_img = view.findViewById(R.id.add_img);
cc=view.findViewById(R.id.cancel);
add_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
goToAlbum();
}
});
cc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread() {
public void run() {
// ftp 연결
try {
FTPClient mFTP = new FTPClient();
mFTP.connect("112.175.184.74", 21);// ftp로 접속
mFTP.setFileType(FTP.BINARY_FILE_TYPE); // 바이너리 파일
mFTP.setBufferSize(1024 * 1024); // 버퍼 사이즈
mFTP.enterLocalPassiveMode();// 패시브 모드로 접속 // 업로드 경로 수정 (선택 사항 )
File path = new File(imagepath); // 업로드 할 파일이 있는 경로(예제는 갤러리에서 고른 사진 경로)
FileInputStream in=new FileInputStream(path);
} catch (SocketException e) { // TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace(); }
}
}.start();
insertoToDatabaseContent(postcontent.getText().toString(),"http://아이디.dothome.co.kr/files/"+whatthe.pref_postnum.getInt("text", 0)+".png",whatthe.userNickname);
}
});
return view;
}
private void goToAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
startActivityForResult(intent, PICK_FROM_ALBUM);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_FROM_ALBUM) {
Uri photoUri = data.getData();
imagepath=getRealPathFromURI(photoUri);
Cursor cursor = null;
try {
assert photoUri != null;
cursor = getContext().getContentResolver().query(photoUri, proj, null, null, null);
assert cursor != null;
cursor.moveToFirst();
tempFile = new File(cursor.getString(column_index));
} finally {
if (cursor != null) {
}
}
setImage();
}
}
private String getRealPathFromURI(Uri contentUri) {
Cursor cursor = getContext().getContentResolver().query(contentUri, proj, null, null, null);
if(cursor.moveToFirst()){
column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
}
return cursor.getString(column_index);
}
private void setImage() {
BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap originalBm = BitmapFactory.decodeFile(tempFile.getAbsolutePath(), options);
BitMapToString(originalBm);
imageView1.setImageBitmap(originalBm);
}
public void BitMapToString(Bitmap bitmap){
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte [] arr=baos.toByteArray();
String image= Base64.encodeToString(arr, Base64.DEFAULT);
try{
}catch (Exception e){
Log.e("exception",e.toString());
}catch(OutOfMemoryError e){
Toast.makeText(getContext(), "이미지 용량이 너무 큽니다.", Toast.LENGTH_SHORT).show();
}
}
private void insertoToDatabaseContent(String content, String imgurl, String nickname) {
class InsertData extends AsyncTask<String, Void, String> {
ProgressDialog loading;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
if(s.equalsIgnoreCase("글이 등록되었습니다.")){
Intent intent = new Intent(getContext(), whatthe.class);
intent.putExtra("userName", whatthe.userNickname);
startActivity(intent);
getActivity().finish();
}
else{
AlertDialog.Builder builder=new AlertDialog.Builder(getContext());
builder.setMessage(s)
.setNegativeButton("retry",null)
.create()
.show();
}
}
@Override
protected String doInBackground(String... params) {
try {
String Content = (String) params[0];
String ImgUrl = (String) params[1];
String NickName = (String) params[2];
URL url = new URL(link);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while ((line = reader.readLine()) != null) {
break;
}
return sb.toString();
} catch (Exception e) {
return new String("Exception: " + e.getMessage());
}
}
}
InsertData task = new InsertData();
task.execute(content, imgurl, nickname);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위코드를 설명하자면
1. 갤러리에 들어가서 사진을 받아온다.
2. 글을 적고 작성을 누르면 이미지를 ftp를 통해 url로 보낸다.
3. 글의 내용과 사진의 url을 데이터베이스로 보내서 삽입시킨다.
다음은 이 데이터베이스의 이미지를 url을 통하여 보여주는 방법이다.
리사이클 러뷰를 사용해서 리스트 형태로 뿌려주기 위해서 adapter를 구성하였다.
SimpleTextAdapter.java
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
|
public class SimpleTextAdapter extends RecyclerView.Adapter<SimpleTextAdapter.ViewHolder> {
private ArrayList<Item> mData = null ;
// 아이템 뷰를 저장하는 뷰홀더 클래스.
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textView1 ;
private ImageView imageView_img,imageView_img2;
private TextView textView_day, textView_name, texView_text, texView_jot,texView_dat;
ViewHolder(View itemView) {
super(itemView) ;
imageView_img = (ImageView) itemView.findViewById(R.id.imageView_img);
imageView_img2 = (ImageView) itemView.findViewById(R.id.imageView_img2);
textView_name = (TextView) itemView.findViewById(R.id.textView_name);
textView_day = (TextView) itemView.findViewById(R.id.textView_day);
texView_text = (TextView) itemView.findViewById(R.id.textView_text);
texView_jot = (TextView) itemView.findViewById(R.id.textView_jot);
texView_dat = (TextView) itemView.findViewById(R.id.textView_dat);
}
}
// 생성자에서 데이터 리스트 객체를 전달받음.
SimpleTextAdapter(ArrayList<Item> list) {
mData = list ;
}
// onCreateViewHolder() - 아이템 뷰를 위한 뷰홀더 객체 생성하여 리턴.
@Override
public SimpleTextAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext() ;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
View view = inflater.inflate(R.layout.recyclerview_item, parent, false) ;
SimpleTextAdapter.ViewHolder vh = new SimpleTextAdapter.ViewHolder(view) ;
return vh ;
}
// onBindViewHolder() - position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시.
@Override
public void onBindViewHolder(SimpleTextAdapter.ViewHolder holder, int position) {
}
// getItemCount() - 전체 데이터 갯수 리턴.
@Override
public int getItemCount() {
return mData.size() ;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
1
2
|
나는 이미지를 Glide 라이브러리를 사용해서 간단하게 구현하였다. Glide 라이브러리를 사용하려면 넣어주어야 할 구문들이 있는데 구글에 찾아보면 많이 나오니까 생략하도록 하겠다.
이런 식으로 잘 구현되는 것을 볼 수 있다.
반응형
'개발 > 안드로이드' 카테고리의 다른 글
[안드로이드/android] FCM 푸시알람 구현 (0) | 2019.07.22 |
---|---|
[안드로이드/android] sns 친구맺기 데이터 스트럭쳐 (0) | 2019.07.22 |
[안드로이드/android] SharedPreferences 를 이용한 자동로그인 구현과 포스트이름 나타내기 (0) | 2019.07.22 |
[안드로이드/android] 카카오톡 API 로그인 자신의 데이터베이스에 연동시키기(php 서버 이용) (0) | 2019.07.22 |
[안드로이드/android] 안드로이드 데이터베이스 연동해서 로그인 기능 구현(웹호스팅 사이트 이용) (0) | 2019.07.22 |
Comments