안드로이드 read_external_storage permission 권한 요청 질문!

조회수 509회
package com.moonsung.todaymusic;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.io.File;
import java.util.ArrayList;

class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MainHolder> {
    private ArrayList<String> listData = new ArrayList<>();
    private ArrayList<String> listData2 = new ArrayList<>();
    private int device_width;
    private Context context = null;

    class MainHolder extends RecyclerView.ViewHolder {
        private TextView main_text;
        private TextView main_text2;
        private ImageView image;

        MainHolder(View view) {
            super(view);
            this.main_text = view.findViewById(R.id.subject);
            this.main_text2 = view.findViewById(R.id.smallsubject);
            this.image = view.findViewById(R.id.image);
        }
    }

    RecyclerAdapter(ArrayList<String> list, ArrayList<String> list2, int device_width, Context context) {
        this.listData = list;
        this.listData2 = list2;
        this.device_width = device_width;
        this.context = context;
    }

    @NonNull
    @Override
    public MainHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
        return new MainHolder(view);
    }

    @Override
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public void onBindViewHolder(@NonNull MainHolder holder, int position) {
        holder.main_text.setText(listData.get(position));
        holder.main_text.setWidth(this.device_width * 50 / 100);

        holder.main_text2.setText(listData2.get(position));

        holder.image.setBackground(new ShapeDrawable(new OvalShape()));
        holder.image.setClipToOutline(true);

        /*if(listData.get(position) == "Girls like you") {
            holder.main_text.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try {
                        MediaPlayer player = MediaPlayer.create(context, R.raw.girlslikeyou);
                        player.start();

                        Toast.makeText(context, "재생 시작됨.", Toast.LENGTH_SHORT).show();

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }*/
    }

    @Override
    public int getItemCount() {
        return listData.size();
    }
}

public class MainActivity extends AppCompatActivity {
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    private int getDeviceWidth() {
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();

        display.getRealSize(size);
        return size.x;
    }

    private void initMenuButton() {
        final Button button1 = findViewById(R.id.btn1);
        final Button button2 = findViewById(R.id.btn2);
        final Button button3 = findViewById(R.id.btn3);

        button1.setTextColor(Color.parseColor("#FFFFFF"));
        button1.setTextSize(20);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                initMenuButtonColor("#D3D3D3");
                button1.setTextColor(Color.parseColor("#FFFFFF"));
                button1.setTextSize(20);
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                initMenuButtonColor("#D3D3D3");
                button2.setTextColor(Color.parseColor("#FFFFFF"));
                button2.setTextSize(20);
            }
        });

        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                initMenuButtonColor("#D3D3D3");
                button3.setTextColor(Color.parseColor("#FFFFFF"));
                button3.setTextSize(20);
            }
        });
    }

    private void initMenuButtonColor(String hex) {
        Button button1 = findViewById(R.id.btn1);
        Button button2 = findViewById(R.id.btn2);
        Button button3 = findViewById(R.id.btn3);

        button1.setTextColor(Color.parseColor(hex));
        button2.setTextColor(Color.parseColor(hex));
        button3.setTextColor(Color.parseColor(hex));

        button1.setTextSize(15);
        button2.setTextSize(15);
        button3.setTextSize(15);
    }

    private ArrayList[] getFileList() {
        ArrayList[] arr = new ArrayList[2];
        ArrayList<String> files = new ArrayList<>();
        ArrayList<String> infor = new ArrayList<>();

        String sdcard_path = Environment.getExternalStorageDirectory().getAbsolutePath();

        Log.d("TAG", sdcard_path);
        File target_dic = new File(sdcard_path);
        File[] target_files = target_dic.listFiles();

        if(target_files.length != 0) {
            for(File file : target_files) {
                files.add(file.getName());
                infor.add(file.length() + "B");
            }
        }

        arr[0] = files;
        arr[1] = infor;

        return arr;
    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    private void setRecyclerView(ArrayList<String> list, ArrayList<String> list2) {
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        RecyclerAdapter recyclerAdapter = new RecyclerAdapter(list, list2, getDeviceWidth(), MainActivity.this);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(recyclerAdapter);
    }

    private void playAudio() {
        try {
            MediaPlayer player = MediaPlayer.create(MainActivity.this, R.raw.girlslikeyou);
            player.start();

            Toast.makeText(this, "재생 시작됨.", Toast.LENGTH_SHORT).show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        initMenuButton();
        setupPermission();
    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    private void setupPermission() {
        int chk = checkCallingOrSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (chk == PackageManager.PERMISSION_DENIED) {
                ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE }, 0);
                return;
            }
        }

        if(chk == PackageManager.PERMISSION_GRANTED) {
            ArrayList[] arr = getFileList();
            setRecyclerView(arr[0], arr[1]);
        }

        return;
    }

    @Override
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        Log.d("TAG", "권한결과 체크함수 호출됨.");

        if(requestCode == 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            ArrayList[] arr = getFileList();
            setRecyclerView(arr[0], arr[1]);

        } else {
            Toast.makeText(this, "권한을 설정해주세요.", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}

노래스트리밍앱을 한번 만들어보려고 합니다 ㅜㅜ. 일단 일차적으로 sdcard안에 있는 파일들과 폴더들을 가져오는 작업을 수행하려고했는데 게속 .listFiles()함수가 null을 반환하길래 구글링을 조금 해 본결과, 권한문제라는걸 알게되었고(특정안드로이드 버전 이상부터는 따로 또 권한요청을 해야한다네요...) 그래서 권한을 요청하는 setupPermission이라는 함수를 선언했습니다. 그러나 맨 처음 앱을 실행하고 권한허용 창이 뜰때 허용을 누르면 파일이 정상적으로 잘 로드되지만, 두번째부터는 다시 또 처음처럼 null을 반환해서 오류가 나는 상황이 발생하네요 ㅜㅜ. setupPermission함수에서 이미 권한이 있는 경우에는 그냥 별다른 요청없이 파일목록을 로드하게해놨는데 왜 오류가 발생하는걸까요ㅜㅜ.

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)