카테고리 없음
스마트폰 모든 이미지/사진 보여주기, 안드로이드
LODE_RUNNER
2020. 7. 11. 17:38
전체 패키지를 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();
}
};
};
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>