상세 컨텐츠

본문 제목

[안드로이드] 이미지 리스트 다운로드하는 방법 DownloadManager

안드로이드

by aries574 2021. 7. 13. 19:12

본문


2021.06.28 - [안드로이드] - [안드로이드]정해진 시간에 알람 울리는 방법 Notification TimePicker

 

[안드로이드]정해진 시간에 알람 울리는 방법 Notification TimePicker

2020.12.25 - [안드로이드] - [안드로이드]Notification 간단한 알림 띄우기 [안드로이드]Notification 간단한 알림 띄우기 2020/12/24 - [안드로이드] - [안드로이드]DatePicker 달력(캘린더) 만들어보기 이번 시..

aries574.tistory.com

2021.06.30 - [안드로이드] - [안드로이드] 내가 선택한 색으로 배경색 변경하는 방법

 

[안드로이드] 내가 선택한 색으로 배경색 변경하는 방법

2021.01.22 - [안드로이드] - [안드로이드] 안드로이드 스튜디오 기본 색상 가져오는 방법 [안드로이드] 안드로이드 스튜디오 기본 색상 가져오는 방법 2021/01/19 - [안드로이드] - [안드로이드] DrawerLayo

aries574.tistory.com

 

이번 시간에는 이전에 했던 이미지를 리스트로 보여주는 방법에서 기능을 하나 추가하려고 합니다.

이미지를 길게 눌렀을 때, 다운로드 하겠는지 물어보고, 하겠다고 하면 이미지를 다운로드하는

기능을 넣으려고 합니다.  저번에 했던것에서 추가하는 것이기 때문에 저번에 했던 것에서

새로운 것만 하겠습니다.

2021.07.11 - [안드로이드] - [안드로이드] 이미지 리스트로 보여주는 방법 Picasso Recyclerview

 

[안드로이드] 이미지 리스트로 보여주는 방법 Picasso Recyclerview

2021.06.30 - [안드로이드] - [안드로이드] 내가 선택한 색으로 배경색 변경하는 방법 [안드로이드] 내가 선택한 색으로 배경색 변경하는 방법 2021.01.22 - [안드로이드] - [안드로이드] 안드로이드 스튜

aries574.tistory.com

1. 라이브러리 추가

build.gradle(Module: 앱이름.app)

이번에는 사용자의 디바이스에 이미지를 저장해야 하기 때문에 스토리지 권한을 추가해야 합니다.

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

 

2. 어뎁터 클래스 기능 추가 (ExamAdapter.java)

MainActivity.java에서 이미지 클릭 시 저장하는 기능을 사용하기 위해서 어뎁터에 인터페이스를 추가합니다.

public class ExamAdapter extends RecyclerView.Adapter<ExamAdapter.ExampleViewHoler>{

    public static final int REQUEST_CODE = 100;

    private Context context;
    private ArrayList<ExamItem> examItemList = new ArrayList<>();

    private OnItemClickListener mListener;

    public interface OnItemClickListener{
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
    }

    public ExamAdapter() {
    }

    public ExamAdapter(Context context, ArrayList<ExamItem> examItemList) {

        this.context = context;
        this.examItemList = examItemList;
    }

    @Override
    public ExampleViewHoler onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
        return new ExampleViewHoler(v);
    }

    @Override
    public void onBindViewHolder(ExampleViewHoler holder, int position) {

        ExamItem currentItem = examItemList.get(position);

        String imageurl = currentItem.getImageUrl();

        Picasso.with(context).load(imageurl).fit().centerInside().into(holder.imageView);
    }

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


    public void removeAllItem(){
        examItemList.clear();
    }

    public class ExampleViewHoler extends RecyclerView.ViewHolder{

        public ImageView imageView;


        public ExampleViewHoler(View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.image_view);

            imageView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {

                    if(mListener != null){
                        int position = getAbsoluteAdapterPosition();
                        if(position != RecyclerView.NO_POSITION){
                            mListener.onItemClick(position);
                        }
                    }

                    return true;
                }
            });
        }
    }
}

 

3. 메인코드 기능 추가(MainActivity.java)

public class MainActivity extends AppCompatActivity implements ExamAdapter.OnItemClickListener {

    private RecyclerView recyclerView;
    private ExamAdapter adapter;
    private ArrayList<ExamItem> examList;
    private RequestQueue requestQueue;

    private EditText search_text; //검색어

    public static final int REQUEST_CODE = 100;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_CODE);
            }
        }

        search_text = findViewById(R.id.search_text);

        Button search_btn = findViewById(R.id.search_btn);
        search_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                adapter.removeAllItem();

                String search_word = "";

                search_word = search_text.getText().toString();

                parseJSON(search_word);
                
            }
        });

        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        examList = new ArrayList<>();

        adapter = new ExamAdapter();
        recyclerView.setAdapter(adapter);

        requestQueue = Volley.newRequestQueue(this);

    }

    private void parseJSON(String search_word){

        String apiKey = "사용자 kEY";

        String url = "https://pixabay.com/api/?key=" + apiKey +  "&q=" +  search_word + "&image_type=photo";

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArray = response.getJSONArray("hits");

                            for(int i = 0; i < jsonArray.length(); i++){
                                JSONObject hit = jsonArray.getJSONObject(i);

                                String imageUrl = hit.getString("webformatURL");

                                examList.add(new ExamItem(imageUrl));
                            }

                            adapter = new ExamAdapter(MainActivity.this, examList);
                            recyclerView.setAdapter(adapter);
                            adapter.setOnItemClickListener(MainActivity.this);


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

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });

        requestQueue.add(request);
    }

    /**
     * 이미지 클릭시에 호출됨
     * @param position 해당 이미지 위치값
     */
    @Override
    public void onItemClick(int position) {

        Log.d("Main", "onItemClick");
        String imageURL = examList.get(position).getImageUrl();
        alertDialog(imageURL, "imageName");
    }

    public void alertDialog(String url, String outputFileName){

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("다운로드");
        builder.setMessage("이미지를 다운로드 하시겠습니까");
        builder.setPositiveButton("예",
                new DialogInterface.OnClickListener (){
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                        String imageName = "Image" + randomNum();

                        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

                        //제목
                        request.setTitle(imageName);

                        //설명
                        request.setDescription(imageName);

                        //알림설정
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

                        request.allowScanningByMediaScanner();

                        //다운로드 완료시에 보여지는 이름
                        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, imageName);

                        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);

                        manager.enqueue(request);
                    }
                });
        builder.setNegativeButton("아니오",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(getApplicationContext(), "아니오", Toast.LENGTH_SHORT).show();
                    }
                });

        builder.show();
    }

    /**
     * 랜덤 숫자 생성
     * @return 랜덤숫자자
     */
    public String randomNum(){

        int num = (int)(Math.random()*10000);

        return String.valueOf(num);
    }
}

 

4. 실행화면

디바이스에 파일 저장 권한을 물어보는 다이얼로그 창이 뜨며 ALLOW를 누르고

이미지를 길게 클릭하면 이미지를 다운로드할 수 있습니다.

 

 

 

맘에 드셨다면 공감 부탁드려요

문의 댓글 환영합니다.

 

반응형

관련글 더보기

댓글 영역