카테고리 없음

스마트폰 모든 이미지/사진 보여주기, 안드로이드

LODE_RUNNER 2020. 7. 11. 17:38

AllPictures.zip
0.14MB

전체 패키지를 zip 으로 첨부

//  스마트폰에 저장된 모든 이미지와 사진 들을 보여주기
//   ㅡ  보여주기 시간 간격 : 1초
//   ㅡ  처음부터 끝까지 순차적으로  또는  무작위(RANDOM)
//   ㅡ  사용된 기술 : 미디어스토어, 커서, 리스트, 쓰레드, 이미지뷰
//                  MediaStore, Cursor, List, Thread, ImageView
//   ㅡ  2020.7.11.  by LODE_RUNNER
//      android:label="몽땅_쑈"

package com.example.allpictures;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentUris;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.util.Log;
import android.util.Size;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import static java.lang.Thread.sleep;

public class MainActivity extends AppCompatActivity {
    static final String KEY_DATA = "KEY_DATA";
    static String Data = "" ;
//  TextView textView;
    String[] permission_list = {
            Manifest.permission.READ_EXTERNAL_STORAGE
    };
    static Bitmap bitmap = null ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        checkPermissions();

        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            setContentView(R.layout.activity_main);
        } else {
            Data = savedInstanceState.getString(KEY_DATA);
                setContentView(R.layout.activity_main);
        }

        setContentView(R.layout.activity_main);
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .permitDiskReads()
                .permitDiskWrites()
                .permitNetwork().build());

        Thread IS_thread = new Thread() {
            @Override
            public void run() {
                int input_stream = 2 ;
                switch  ( input_stream ) {
                    case 0:   //  input_stream 비적용
                        slide_show_A();
                        break ;
                    case 1:   //  input_stream 적용
                        slide_show_B();
                        break ;
                    case 2:   //
                        slide_show_Random();
                        break ;
                    default:
                        break ;
                }
            }
        };
        IS_thread.start();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //      Data = textView.getText().toString();
        //      outState.putStringArrayList(KEY_DATA, Data); 임시
    }

    public void slide_show_A () {
        class Images {
            private final Uri uri;
            private final String name;
            private final int size;
            public Images(Uri uri, String name,
                          int size) {
                this.uri = uri;
                this.name = name;
                this.size = size;
            }
        }
        List<Images> ImagesList = new ArrayList<Images>();
        String[] projection = new String[] {
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.SIZE
        };
        Cursor cursor = getApplicationContext().getContentResolver().query (
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection , null , null, null
        );

        Log.d("============", "cursor.getCount() = " + cursor.getCount());
        if (cursor == null || !cursor.moveToFirst() || cursor.getCount() == 0 )  {
            Log.e("TAG", "cursor null or cursor is empty");
            return;
        }

        {
            int idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
            int nameColumn =
                    cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
            int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE);
            while (cursor.moveToNext()) {
                final String name = cursor.getString(nameColumn);
                int size = cursor.getInt(sizeColumn);
                long id = cursor.getLong(idColumn);
                final Uri contentUri = ContentUris.withAppendedId(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
                ImagesList.add(new Images(contentUri, name, size));
                try {
                    int image_src = 2 ;
                    switch  ( image_src ) {
                        case 1:   //  그림의 가로 세로 방향이 뒤바뀌는 경우가 있슴
                            bitmap = getBitmapFromUri(contentUri) ;
                            break ;
                        case 2:   //  정상작동 확인
                            bitmap = getApplicationContext().getContentResolver().loadThumbnail(
                                    contentUri, new Size(640, 480), null);
                            break ;
                        default:
                            break ;
                    }
                    Thread slide_show_sub_thread = new Thread( ) {
                        @Override
                        public void run() {
                            runOnUiThread(new Runnable() {
                                @SuppressLint("WrongViewCast")
                                @Override
                                public void run() {
                                    setContentView(R.layout.activity_main);
                                    ImageView imageView = (ImageView) findViewById(R.id.imageView) ;
                                    imageView.setImageBitmap  (bitmap);
                                }
                            }) ;  }};
                    slide_show_sub_thread.start();
                    try {
                        sleep(1000);   // 보여주기 간격 1초 ( 1000 밀리초 )
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public Bitmap getBitmapFromUri(Uri uri) throws IOException {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().openFileDescriptor(uri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        parcelFileDescriptor.close();
        return image;
    }

//  ************************************************************************
    public void slide_show_B () {

        Uri externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projection = new String[]{
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.MIME_TYPE
        };
        Cursor cursor = getContentResolver().query(externalUri, projection, null, null, null);
        int name_int = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
        if (cursor == null || !cursor.moveToFirst()) {
            Log.e("TAG", "cursor null or cursor is empty");
            return;
        }
        do {
            final String contentUrl = externalUri.toString() + "/" + cursor.getString(0);
            final String name = cursor.getString(name_int) ;
            try {
                InputStream is = getContentResolver().openInputStream(Uri.parse(contentUrl));
                final String TAG = "slide_show_B: ";
                final Bitmap bitmap = BitmapFactory.decodeStream(is);
                is.close();
                if ( bitmap == null ) {
                    Log.d(TAG, "Error , bitmap == null ");
                } else {
                    Thread slide_showB_sub_thread = new Thread() {
                        @Override
                        public void run() {
                            runOnUiThread(new Runnable() {
                                @SuppressLint("WrongViewCast")
                                @Override
                                public void run() {
                                    setContentView(R.layout.activity_main);
                                    ImageView imageView = (ImageView) findViewById(R.id.imageView) ;
                                    imageView.setImageBitmap  (bitmap);
                                }
                            }) ;  }};
                    slide_showB_sub_thread.start();
                }
                Thread.sleep(1000);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } while (cursor.moveToNext());
    }

//  ************************************************************************
    public void slide_show_Random () {
        String TAG = "●●●●  slide_show_Random  : ";
        Log.d(TAG, "개시");


        class Images {
            private final Uri uri;
            private final String name;
            private final int size;
            public Images(Uri uri, String name,
                          int size) {
                this.uri = uri;
                this.name = name;
                this.size = size;
            }
        }
        String[] projection = new String[] {
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.SIZE
        };
        Cursor cursorR = getApplicationContext().getContentResolver().query (
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection , null , null, null
        );
        int max_PICs = cursorR.getCount() - 1;
        Log.d(TAG, "cursor.getCount() = " + cursorR.getCount());
        if (cursorR == null || !cursorR.moveToFirst() || max_PICs == 0 )  {
            Log.e("TAG", "cursor null or cursor is empty");
            return;
        }

        List uri_array = new ArrayList();
        {
            int idColumn = cursorR.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
            int list_index = 0 ;
            while (cursorR.moveToNext()) {
                long id = cursorR.getLong(idColumn);
                final Uri contentUri = ContentUris.withAppendedId(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
                uri_array.add(list_index, contentUri);
            }
            ;
        };
        Uri contentUri = null;
        for ( ;; ){
            int list_index = 0 ;
            list_index = (int) (( Math.random() * max_PICs ) * 1);
            contentUri = (Uri) uri_array.get(list_index);
            try {
                bitmap = getApplicationContext().getContentResolver().loadThumbnail(
                         contentUri, new Size(640, 480), null);
                Thread slide_show_sub_thread = new Thread( ) {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @SuppressLint("WrongViewCast")
                            @Override
                            public void run() {
                                setContentView(R.layout.activity_main);
                                ImageView imageView = (ImageView) findViewById(R.id.imageView) ;
                                imageView.setImageBitmap  (bitmap);
                            }
                        }) ;  }};
                slide_show_sub_thread.start();
                try {
                    sleep(1000);   // 보여주기 간격 1초 ( 1000 밀리초 )
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }   //  for
    }  //


    private void checkPermissions() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(MainActivity.this,
                    "앱 시작전에 먼저, 저장장치 읽기 권한을 주세요", Toast.LENGTH_LONG).show();
            finish();
        }
    };
};

AllPictures.zip
0.14MB

 

manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.allpictures">

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


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="몽땅_쑈"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

activity_mail.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#000000"
        android:backgroundTint="#000000"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ic_launcher_background" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

styles.xml

<resources>
    <!-- Base application theme. -->
    <!-- https://docs.microsoft.com/ko-kr/xamarin/android/user-interface/material-theme -->
    <style name="AppTheme" parent="Theme.AppCompat">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimaryDark</item>
        <item name="colorPrimaryDark">#000000</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:navigationBarColor">#000000</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
</resources>