안드로이드 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함수에서 이미 권한이 있는 경우에는 그냥 별다른 요청없이 파일목록을 로드하게해놨는데 왜 오류가 발생하는걸까요ㅜㅜ.
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력