오늘이라도

[Android] 31. 안드로이드 & DB & 서버(스프링) 연동 ③ : 로그인 후 화면 출력, 사진 클릭, 사진 촬영 후 등록, 앨범에 있는 사진 등록 본문

취업성공패키지 SW 개발자 교육/Android

[Android] 31. 안드로이드 & DB & 서버(스프링) 연동 ③ : 로그인 후 화면 출력, 사진 클릭, 사진 촬영 후 등록, 앨범에 있는 사진 등록

upcake_ 2020. 6. 19. 10:48
반응형

https://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

반응형