오늘이라도
[Android] 31. 안드로이드 & DB & 서버(스프링) 연동 ③ : 로그인 후 화면 출력, 사진 클릭, 사진 촬영 후 등록, 앨범에 있는 사진 등록 본문
[Android] 31. 안드로이드 & DB & 서버(스프링) 연동 ③ : 로그인 후 화면 출력, 사진 클릭, 사진 촬영 후 등록, 앨범에 있는 사진 등록
upcake_ 2020. 6. 19. 10:48https://github.com/upcake/Class_Examples
교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다.
gif 파일은 클릭해서 보는 것이 정확합니다.
- 안드로이드 & DB & 서버(스프링) 연동 ③ : 로그인 후 화면 출력, 사진 클릭, 사진 촬영 후 등록, 앨범에 있는 사진 등록 -
○ 작업 순서
1. xml/filepaths.xml 작성
2. AndroidManifest.xml
- <provider> 작성
- 스토리지 사용 권한, 카메라 사용 권한 설정
3. Sub1Insert 액티비티 생성
4. activity_sub1_insert.xml 작성
5. drawable/blank.jpg
- 수업 자료에서 복사 붙여넣기
6. Sub1Insert.java
- 객체 선언 EditText ~ SimpleDateFormat
- onCreate()
tmpDateFormat 초기화
객체 초기화
날짜 객체 설정 출력
형식 설정
datePicker.init()
요구하는 매개 변수 넣어주고 리스너 설정
onDateChanged()
date 설정
photoBtn 버튼 설정
onClick()
try-catch 블록 만들고 파일 만들고 절대 경로 logcat에 출력하게끔 작성
이미지뷰와 인텐트 설정
- createFile() 메서드 작성
- onActivityResult() 메서드 작성
if else 블록 작성
7. CommonMethod.java
- 이미지 로테이트 및 사이즈 변경 작성
- 사진 찍을때 돌린 각도 알아보기 작성
- 이미지 돌리기 작성
8. Sub1Insert.java
- onActivityResult()
try catch 블록 작성
이미지 돌리기, 리사이즈
이미지 경로 설정
9. Sub1.java - 버튼1 설정
10. build.gradle(:app) 버전이 29나 29.0.3으로 되어있는지 확인
11. MainActivity.java
- checkDangerousPermissions()
2번에서 새로 추가한 권한 설정
12. Sub1Insert.java
- onCreate()
photoLoad 버튼 설정
onClick()
인텐트 설정
- onActivityResult()
else if 블록 작성
try catch 블록 작성
- getPathFromURI() 메서드 작성
- onCreate()
btnAdd 버튼 설정
btnCancel 버튼 설정
13. ListInsert.java 생성
- JoinInsert를 복사 붙여넣기해서 이름 바꾼뒤 알맞게 수정
변수 이름 바꿔주고 생성자 생성
doInBackground() 수정
14. Sub1.java
- onNewIntent() 작성
- processIntent() 작성
※ 스프링에서 작동되는 파일들의 경로
스프링 워크스페이스\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\AnSpring_App\resources
○ 작동 화면 및 코드
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="storage/emulated" path="."/>
</paths>
▲filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.my50_project">
<!-- 권한 부여 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<!-- https가 아니라 http가 와도 허가하는 부분 -->
<activity android:name=".Sub1Insert"></activity>
<activity android:name=".Sub1" /> <!-- JoinActivity를 Intent로 부르기 위한 설정 -->
<activity android:name=".JoinActivity" /> <!-- http 라이브러리 사용 -->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <!-- API24 이상부터 Url 이 file:// 로 시작되면 안되서 content:// 으로 변환시키는 부분 -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
</application>
</manifest>
▲AndroidManifest.xml
<?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"
android:id="@+id/activity_sub1_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/etId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="ID"
android:inputType="number|text|numberDecimal" />
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Name"
android:inputType="textPersonName" />
<DatePicker
android:id="@+id/datePicker"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"
android:calendarViewShown="false"
android:datePickerMode="spinner" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="4">
<LinearLayout
android:layout_width="0dp"
android:layout_height="150dp"
android:layout_weight="2"
android:orientation="vertical">
<Button
android:id="@+id/btnPhoto"
android:layout_width="match_parent"
android:layout_height="75dp"
android:text="사진찍기" />
<Button
android:id="@+id/btnLoad"
android:layout_width="match_parent"
android:layout_height="75dp"
android:text="사진로드" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="150dp"
android:orientation="vertical"
android:layout_weight="2">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin ="10dp">
<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="match_parent"
android:scaleType="fitCenter"
app:srcCompat="@drawable/blank" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="추가" />
<Button
android:id="@+id/btnCancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="취소" />
</LinearLayout>
</ScrollView>
</LinearLayout>
▲activity_sub1_insert.xml
package com.example.my50_project;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.example.my50_project.ATask.ListInsert;
import com.example.my50_project.Common.CommonMethod;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.example.my50_project.Common.CommonMethod.ipConfig;
import static com.example.my50_project.Common.CommonMethod.isNetworkConnected;
public class Sub1Insert extends AppCompatActivity {
//로그캣 설정
private static final String TAG = "main Sub1Insert";
//객체 선언
EditText etId, etName;
DatePicker datePicker;
String id = "", name = "", date = "";
Button photoBtn;
Button photoLoad;
Button btnAdd;
Button btnCancel;
ImageView imageView;
public String imageRealPath, imageDbPath;
final int CAMERA_REQUEST = 1000;
final int LOAD_IMAGE = 1001;
File file = null;
long fileSize = 0;
java.text.SimpleDateFormat tmpDateFormat;
//--------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub1_insert);
//심플 데이트 포맷 설정
tmpDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
//객체 초기화
etId = findViewById(R.id.etId);
etName = findViewById(R.id.etName);
datePicker = findViewById(R.id.datePicker);
photoBtn = findViewById(R.id.btnPhoto);
photoLoad = findViewById(R.id.btnLoad);
btnAdd = findViewById(R.id.btn_add);
btnCancel = findViewById(R.id.btnCancel);
imageView = findViewById(R.id.imageView);
//날짜 객체 설정
Date tempDate = new Date();
//출력 형식을 연도가 4자리, 월, 일이 2자리로 나오게 설정
//월은 0 ~ 11로 되어있어서 +1을 해줘야 올바르게 출력 됨
date = new DecimalFormat("0000").format(tempDate.getYear()) + "/" +
new DecimalFormat("00").format(tempDate.getMonth() + 1)
+ "/" + new DecimalFormat("00").format(tempDate.getDay());
datePicker.init(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//날짜가 변경되면 변경된 날짜가 나오게 설정
date = new DecimalFormat("0000").format(year) + "/" +
new DecimalFormat("00").format(monthOfYear + 1)
+ "/" + new DecimalFormat("00").format(dayOfMonth);
}
});
//사진 찍기 버튼 설정
photoBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try { //파일을 만들고 절대 경로를 logcat에 출력
file = createFile();
Log.d(TAG, "onClick: " + file.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
//이미지뷰와 인텐트 설정
imageView.setVisibility(View.VISIBLE);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // API24 이상 부터
intent.putExtra(MediaStore.EXTRA_OUTPUT,
FileProvider.getUriForFile(getApplicationContext(),
getApplicationContext().getPackageName() + ".fileprovider", file));
Log.d("sub1:appId", getApplicationContext().getPackageName());
}else {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
}
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, CAMERA_REQUEST);
}
}
});
photoLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_PICK);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), LOAD_IMAGE);
}
});
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//네트워크가 정상적으로 연결되어 있으면
if(isNetworkConnected(getApplicationContext()) == true) {
if(fileSize <= 30000000) { //파일 크기가 30메가 보다 작아야 업로드 할 수 있음
id = etId.getText().toString();
name = etName.getText().toString();
ListInsert listInsert = new ListInsert(id, name, date, imageDbPath, imageRealPath);
try {
listInsert.execute().get();
} catch (Exception e) {
e.printStackTrace();
}
Intent showIntent = new Intent(getApplicationContext(), Sub1.class);
showIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | // 이 엑티비티 플래그를 사용하여 엑티비티를 호출하게 되면 새로운 태스크를 생성하여 그 태스크안에 엑티비티를 추가하게 됩니다. 단, 기존에 존재하는 태스크들중에 생성하려는 엑티비티와 동일한 affinity(관계, 유사)를 가지고 있는 태스크가 있다면 그곳으로 새 엑티비티가 들어가게됩니다.
Intent.FLAG_ACTIVITY_SINGLE_TOP | // 엑티비티를 호출할 경우 호출된 엑티비티가 현재 태스크의 최상단에 존재하고 있었다면 새로운 인스턴스를 생성하지 않습니다. 예를 들어 ABC가 엑티비티 스택에 존재하는 상태에서 C를 호출하였다면 여전히 ABC가 존재하게 됩니다.
Intent.FLAG_ACTIVITY_CLEAR_TOP); // 만약에 엑티비티스택에 호출하려는 엑티비티의 인스턴스가 이미 존재하고 있을 경우에 새로운 인스턴스를 생성하는 것 대신에 존재하고 있는 엑티비티를 포그라운드로 가져옵니다. 그리고 엑티비티스택의 최상단 엑티비티부터 포그라운드로 가져올 엑티비티까지의 모든 엑티비티를 삭제합니다.
startActivity(showIntent);
finish();
} else {
// 알림창 띄움
final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("알림");
builder.setMessage("파일 크기가 30MB초과하는 파일은 업로드가 제한되어 있습니다.\n30MB이하 파일로 선택해 주십시요!!!");
builder.setPositiveButton("예", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
builder.show();
}
} else {
Toast.makeText(getApplicationContext(), "인터넷이 연결되어 있지 않습니다.", Toast.LENGTH_SHORT).show();
}
}
});
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
private File createFile() throws IOException {
String imageFileName = "My" + tmpDateFormat.format(new Date()) + ".jpg";
File storageDir = Environment.getExternalStorageDirectory();
File curFile = new File(storageDir, imageFileName);
return curFile;
}
//데이터를 주고나서 받을 일이 있을때는 무조건 onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
try {
// 이미지 돌리기 및 리사이즈
Bitmap newBitmap = CommonMethod.imageRotateAndResize(file.getAbsolutePath());
if(newBitmap != null){
imageView.setImageBitmap(newBitmap);
}else{
Toast.makeText(this, "이미지가 null 입니다...", Toast.LENGTH_SHORT).show();
}
//이미지 경로 설정
imageRealPath = file.getAbsolutePath();
String uploadFileName = imageRealPath.split("/")[imageRealPath.split("/").length - 1];
imageDbPath = ipConfig + "/app/resources/" + uploadFileName;
fileSize = imageRealPath.length();
} catch (Exception e) {
e.printStackTrace();
}
} else if(requestCode == LOAD_IMAGE && resultCode == RESULT_OK) {
try {
String path = "";
//데이타에서 Uri 얻기
Uri selectImageUri = data.getData();
if(selectImageUri != null) {
//Uri에서 경로 얻기
path = getPathFromURI(selectImageUri);
}
// 이미지 돌리기 및 리사이즈
Bitmap newBitmap = CommonMethod.imageRotateAndResize(path);
if(newBitmap != null){
imageView.setImageBitmap(newBitmap);
}else{
Toast.makeText(this, "이미지가 null 입니다...", Toast.LENGTH_SHORT).show();
}
//이미지 경로 설정
imageRealPath = path;
Log.d("Sub1Add", "imageFilePathA Path : " + imageRealPath);
String uploadFileName = imageRealPath.split("/")[imageRealPath.split("/").length - 1];
imageDbPath = ipConfig + "/app/resources/" + uploadFileName;
fileSize = imageRealPath.length();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//URI에서 실제 경로 추출하는 메서드
public String getPathFromURI(Uri contentUri) {
String res = null;
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor.moveToFirst()) {
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
res = cursor.getString(column_index);
}
cursor.close();
return res;
}
}
▲Sub1Insert.java
package com.example.my50_project.Common;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import java.io.File;
import java.io.IOException;
public class CommonMethod {
/*public static String ipConfig = "http://192.168.200.151:8989";*/
public static String ipConfig = "http://192.168.0.20:8080";
//public static String ipConfig = "http://121.148.239.200:80";
// 네트워크에 연결되어 있는가
public static boolean isNetworkConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService( Context.CONNECTIVITY_SERVICE );
NetworkInfo info = cm.getActiveNetworkInfo();
if(info != null){
if(info.getType() == ConnectivityManager.TYPE_WIFI){
Log.d("isconnected : ", "WIFI 로 설정됨");
}else if(info.getType() == ConnectivityManager.TYPE_MOBILE){
Log.d("isconnected : ", "일반망으로 설정됨");
}
Log.d("isconnected : ", "OK => " + info.isConnected());
return true;
}else {
Log.d("isconnected : ", "False => 데이터 통신 불가!!!" );
return false;
}
}
// 이미지 로테이트 및 사이즈 변경
public static Bitmap imageRotateAndResize(String path){ // state 1:insert, 2:update
BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = 8;
File file = new File(path);
if (file != null) {
// 돌아간 앵글각도 알기
int rotateAngle = setImageOrientation(file.getAbsolutePath());
Bitmap bitmapTmp = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
// 사진 바로 보이게 이미지 돌리기
Bitmap bitmap = imgRotate(bitmapTmp, rotateAngle);
return bitmap;
}
return null;
}
// 사진 찍을때 돌린 각도 알아보기 : 가로로 찍는게 기본임
public static int setImageOrientation(String path){
ExifInterface exif = null;
try {
exif = new ExifInterface(path);
} catch (IOException e) {
e.printStackTrace();
}
int oriention = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
return oriention;
}
// 이미지 돌리기
public static Bitmap imgRotate(Bitmap bitmap, int orientation){
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_NORMAL:
return bitmap;
case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
matrix.setScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.setRotate(180);
break;
case ExifInterface.ORIENTATION_FLIP_VERTICAL:
matrix.setRotate(180);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_TRANSPOSE:
matrix.setRotate(90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.setRotate(90);
break;
case ExifInterface.ORIENTATION_TRANSVERSE:
matrix.setRotate(-90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.setRotate(-90);
break;
default:
return bitmap;
}
try {
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return bmRotated;
}
catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
}
}
}
▲CommonMethod.java
package com.example.my50_project;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.my50_project.ATask.ListSelect;
import com.example.my50_project.Adapter.MyRecyclerViewAdapter;
import com.example.my50_project.DTO.MyItem;
import java.util.ArrayList;
import static com.example.my50_project.Common.CommonMethod.isNetworkConnected;
public class Sub1 extends AppCompatActivity {
private static final String TAG = "main Sub1";
public static MyItem selItem = null;
Button button1, button2, button3, button4;
RecyclerView recyclerView;
MyRecyclerViewAdapter adapter;
ArrayList<MyItem> myItemArrayList;
ListSelect listSelect;
ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub1);
button1 = findViewById(R.id.button1);
button2 = findViewById(R.id.button2);
button3 = findViewById(R.id.button3);
button4 = findViewById(R.id.button4);
//리사이클러 뷰 시작
recyclerView = findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
myItemArrayList = new ArrayList<>();
adapter = new MyRecyclerViewAdapter(this, myItemArrayList);
recyclerView.setAdapter(adapter);
if(isNetworkConnected(this) == true) {
listSelect = new ListSelect(myItemArrayList, adapter);
listSelect.execute();
} else {
Toast.makeText(this, "인터넷 연결 실패!", Toast.LENGTH_SHORT).show();
}
//버튼1 설정
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), Sub1Insert.class);
startActivity(intent);
}
});
}
//이미 화면이 있을때 받는 곳
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent: 호출됨");
//새로고침하면서 이미지가 겹치는 현상 없애기 위해...
adapter.removeAllItem();
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("데이터 업로딩");
progressDialog.setMessage("데이터 업로딩 중입니다\n" + "잠시만 기다려주세요 ...");
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
processIntent(intent);
}
private void processIntent(Intent intent) {
try {
if(intent != null){
listSelect = new ListSelect(myItemArrayList, adapter);
listSelect.execute().get();
}
} catch (Exception e) {
e.printStackTrace();
}
if(progressDialog != null) {
progressDialog.dismiss();
}
}
}
▲Sub1.java
package com.example.my50_project;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.my50_project.ATask.LoginSelect;
import com.example.my50_project.DTO.MemberDTO;
import java.util.concurrent.ExecutionException;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
// 로그인이 성공하면 static 로그인DTO 변수에 담아서
// 어느곳에서나 접근할 수 있게 한다
public static MemberDTO loginDTO = null;
EditText etID, etPASSWD;
Button btnLogin, btnJoin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkDangerousPermissions();
etID = findViewById(R.id.etId);
etPASSWD = findViewById(R.id.etPASSWD);
btnLogin = findViewById(R.id.btnLogin);
btnJoin = findViewById(R.id.btnJoin);
//로그인 버튼
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(etID.getText().toString().length() != 0 &&
etPASSWD.getText().toString().length() != 0) { //아이디와 비밀번호의 길이가 0이 아니면
String id = etID.getText().toString();
String passwd = etPASSWD.getText().toString();
LoginSelect loginSelect = new LoginSelect(id, passwd);
try {
loginSelect.execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(loginDTO != null) { //로그인 정보가 있으면, 서브1 화면을 띄움
Log.d(TAG, "onClick: id:" + loginDTO.getId());
Intent intent = new Intent(getApplicationContext(), Sub1.class);
startActivity(intent);
} else { //로그인 정보가 맞지 않으면 토스트창 띄우고 id, pw칸 지우고 id칸에 포커스
Toast.makeText(MainActivity.this, "아이디나 비밀번호가 틀렸습니다.", Toast.LENGTH_SHORT).show();
etID.setText("");
etPASSWD.setText("");
etID.requestFocus();
}
}
}
});
//회원 가입 버튼
btnJoin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), JoinActivity.class);
startActivity(intent);
}
});
}
private void checkDangerousPermissions() {
String[] permissions = {
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};
int permissionCheck = PackageManager.PERMISSION_GRANTED;
for (int i = 0; i < permissions.length; i++) {
permissionCheck = ContextCompat.checkSelfPermission(this, permissions[i]);
if (permissionCheck == PackageManager.PERMISSION_DENIED) {
break;
}
}
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "권한 있음", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "권한 없음", Toast.LENGTH_LONG).show();
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
Toast.makeText(this, "권한 설명 필요함.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(this, permissions, 1);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 1) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, permissions[i] + " 권한이 승인됨.", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, permissions[i] + " 권한이 승인되지 않음.", Toast.LENGTH_LONG).show();
}
}
}
}
}
▲MainActivity.java
'취업성공패키지 SW 개발자 교육 > Android' 카테고리의 다른 글
[Android] 30. 안드로이드 & DB & 서버(스프링) 연동 ② : 로그인 후 서브 화면 구성, 서버 연결 까지 (11) | 2020.06.18 |
---|---|
[Android] 29. 안드로이드 & DB & 서버(스프링) 연동 ① : 회원가입, 로그인 구현 (0) | 2020.06.17 |
[Do it! 안드로이드] 03. 첫 번째 앱 만들기 / 03-1. 첫 프로젝트 만들기 (0) | 2020.06.16 |
[Android] 28. AsyncTask (0) | 2020.06.16 |
[Do it! 안드로이드] I. Hello! 안드로이드 / 01. 안드로이드란? / 01-1. 안드로이드 이해하기 / 01-2. 안드로이드의 흐름 살펴보기 (0) | 2020.06.15 |