в моем приложении мне нужно загрузить все изображения из галереи (точнее из альбома) в ArrayList или List для дальнейшей обработки каждого изображения
Раньше я делал это так
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRealm = Realm.getDefaultInstance();
mRealm.beginTransaction();
mRealm.deleteAll();
mRealm.commitTransaction();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
mFabStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, FilePickerActivity.class);
i.setType("image/*");
i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, true);
i.setAction(Intent.ACTION_GET_CONTENT);
i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, false);
i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_FILE_AND_DIR);
i.putExtra(FilePickerActivity.EXTRA_START_PATH, Environment.getExternalStorageDirectory().getPath());
startActivityForResult(i, PHOTO_PICK_SUCCESS);
startActivityForResult(Intent.createChooser(i,"Select Picture"), PICK_IMAGE_MULTIPLE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PHOTO_PICK_SUCCESS && resultCode == Activity.RESULT_OK) {
final List<Uri> files = com.nononsenseapps.filepicker.Utils.getSelectedFilesFromResult(data);
final ExperimentItem experiment = new ExperimentItem();
int expNumber = mRealm.where(ExperimentItem.class).findAll().size() + 1;
experiment.setName("Эксперимент №" + expNumber) ;
mTvStart.setText("Обработка...");
final ProgressBar progress = (ProgressBar) findViewById(R.id.progress);
final TextView count = (TextView) findViewById(R.id.tv_progress);
progressContainer = (LinearLayout) findViewById(R.id.container_progress);
progressContainer.setVisibility(View.VISIBLE);
mBtHistory.setVisibility(View.GONE);
mBtAbout.setVisibility(View.INVISIBLE);
mBtCancel.setVisibility(View.VISIBLE);
final Handler handler = new Handler();
mThread = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < files.size(); i++) {
if (Thread.currentThread().isInterrupted()) {
return;
}
Uri uri = files.get(i);
Log.d(TAG, "onActivityResult: processing " + i);
File file = Utils.getFileForUri(uri);
Log.d(TAG, "onActivityResult: file " + file.getAbsolutePath());
if (file.isDirectory()) {
final File[] filesInDirectory = file.listFiles();
Arrays.sort(filesInDirectory, new Comparator<File>() {
@Override
public int compare(File file, File t1) {
if (file.isDirectory() || t1.isDirectory()) {
return -1;
}
String file1 = file.getName();
String file2 = t1.getName();
int f1 = Integer.parseInt(file1.split("\\.")[0]);
int f2 = Integer.parseInt(file2.split("\\.")[0]);
return f1 - f2;
}
});
for (int k = 0; k < filesInDirectory.length; k++) {
if (Thread.currentThread().isInterrupted()) {
return;
}
File f = filesInDirectory[k];
String mime = MyUtils.getMimeType(f.getAbsolutePath());
Log.d(TAG, "onActivityResult: f " + f.getAbsolutePath());
if (f.isFile() && mime.equals("image/png")) {
Point point = findEye(f);
experiment.getPoints().add(new PointRealmObject(point));
final int finalK = k;
handler.post(new Runnable() {
@SuppressLint("SetTextI18n")
public void run() {
count.setText(finalK + "/" + filesInDirectory.length);
progress.setProgress((filesInDirectory.length * finalK) / 10);
}
});
}
}
} else if (MyUtils.getMimeType(file.getAbsolutePath()).equals("image/png")) {
Point point = findEye(file);
try {
experiment.getPoints().add(new PointRealmObject(point));
}catch (Exception e){}
}
}
// Update the progress bar
handler.post(new Runnable() {
public void run() {
long timeStamp = new Date().getTime();
experiment.setDate(timeStamp);
experiment.setId(timeStamp);
mRealm.beginTransaction();
mRealm.insertOrUpdate(experiment);
mRealm.commitTransaction();
ChartFragment chartFragment = ChartFragment.newInstance(timeStamp);
getSupportFragmentManager().beginTransaction()
.replace(R.id.content, chartFragment)
.addToBackStack(chartFragment.getTag())
.commit();
progressContainer.setVisibility(View.GONE);
mTvStart.setText(getString(R.string.start));
mBtCancel.setVisibility(View.GONE);
mBtHistory.setVisibility(View.VISIBLE);
mBtAbout.setVisibility(View.VISIBLE);
}
});
}
});
mThread.start();
}
}
Получается вручную выбирать изображения из нужного альбома
Но сейчас я пытаюсь автоматически загрузить изображения из альбома в ArrayList
вот как я это делаю
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRealm = Realm.getDefaultInstance();
mRealm.beginTransaction();
mRealm.deleteAll();
mRealm.commitTransaction();
mProgressView = findViewById(R.id.login_progress);
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
final ExperimentItem experiment = new ExperimentItem();
int expNumber = mRealm.where(ExperimentItem.class).findAll().size() + 1;
experiment.setName("Эксперимент №" + expNumber) ;
final Handler handler = new Handler();
mThread = new Thread(new Runnable() {
public void run() {
showProgress(true);
String[] filenames = new String[100];
File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots");
if (path.exists()) {
filenames = path.list();
}
ArrayList<String> imagesPathArrayList = new ArrayList<>();
for (int i = 0; i < filenames.length; i++) {
imagesPathArrayList.add(path.getPath() + "/" + filenames[i]);
imagesPathArrayList.get(i);
}
for (int i = 0; i < filenames.length; i++) {
if (Thread.currentThread().isInterrupted()) {
return;
}
// Uri uri = Uri.parse(imagesPathArrayList.get(i));
Log.d(TAG, "onActivityResult: processing " + i);
for ( i = 0; i < filenames.length; i++) {
file = new File(imagesPathArrayList.get(i));
}
Log.d(TAG, "onActivityResult: file " + file.getAbsolutePath());
if (file.isDirectory()) {
final File[] filesInDirectory = file.listFiles();
Arrays.sort(filesInDirectory, new Comparator<File>() {
@Override
public int compare(File file, File t1) {
if (file.isDirectory() || t1.isDirectory()) {
return -1;
}
String file1 = file.getName();
String file2 = t1.getName();
int f1 = Integer.parseInt(file1.split("\\.")[0]);
int f2 = Integer.parseInt(file2.split("\\.")[0]);
return f1 - f2;
}
});
for (int k = 0; k < filesInDirectory.length; k++) {
if (Thread.currentThread().isInterrupted()) {
return;
}
File f = filesInDirectory[k];
String mime = MyUtils.getMimeType(f.getAbsolutePath());
Log.d(TAG, "onActivityResult: f " + f.getAbsolutePath());
if (f.isFile() && (mime.equals("image/png") || mime.equals("image/PNG") || mime.equals("image/jpg"))) {
Point point = findEye(f);
if (point != null) {
experiment.getPoints().add(new PointRealmObject(point));
final int finalK = k;
handler.post(new Runnable() {
public void run() {
// count.setText(finalK + "/" + filesInDirectory.length);
// progress.setProgress((filesInDirectory.length * finalK) / 100);
}
});
}
}
}
} else if (MyUtils.getMimeType(file.getAbsolutePath()).equals("image/png") ||
MyUtils.getMimeType(file.getAbsolutePath()).equals("image/PNG")
|| MyUtils.getMimeType(file.getAbsolutePath()).equals("image/jpg")) {
Point point = findEye(file);
try {
experiment.getPoints().add(new PointRealmObject(point));
}catch (Exception e){}
}
}
// Update the progress bar
handler.post(new Runnable() {
public void run() {
long timeStamp = new Date().getTime();
experiment.setDate(timeStamp);
experiment.setId(timeStamp);
mRealm.beginTransaction();
mRealm.insertOrUpdate(experiment);
mRealm.commitTransaction();
ChartFragment chartFragment = ChartFragment.newInstance(timeStamp);
getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_fragmentholder, chartFragment)
.addToBackStack(chartFragment.getTag())
.commit();
}
});
}
});
mThread.start();
}
Но на данный момент обрабатывается только одно изображение и, как я полагаю, последнее.
Подскажите что исправить, как сделать так, чтобы все изображения обрабатывались, ваша помощь очень нужна, спасибо)