выбор изображений для Android в ArrayList - PullRequest
0 голосов
/ 16 ноября 2018

в моем приложении мне нужно загрузить все изображения из галереи (точнее из альбома) в 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();


}

Но на данный момент обрабатывается только одно изображение и, как я полагаю, последнее. Подскажите что исправить, как сделать так, чтобы все изображения обрабатывались, ваша помощь очень нужна, спасибо)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...