Christi Az Ответов: 1

Поиск определенных типов файлов из хранилища эмулятора [android studio]


Я новичок в разработке android и пытаюсь создать приложение для листинга книг. Я протолкнул некоторые файлы на SD-карту моего эмулятора через командную строку, но они появились в его хранилище, где вы можете найти несколько папок, таких как загрузки (где находятся мои файлы), сигналы тревоги, музыка и т. д.

Теперь я пытаюсь найти способ получить к нему доступ и загрузить определенные типы книг (например, mobi и epud) через плавающую кнопку Actionbutton.

Я читаю и пишу внешнее хранилище в разрешениях в моем AndroidManifest и это моя основная активность как это выглядит сейчас через много редактирования В и из кода который может помочь

//MainActivity.java
//Hosts the app's fragments and handles communication between them
//I'm skipping the phone parts of the app since my revised one is for tablets only

package com.iekproject.siegfried.libraryapp;

import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.io.File;
import java.util.ArrayList;



public class MainActivity extends AppCompatActivity
    implements LibraryFragment.LibraryFragmentListener, DetailFragment.DetailFragmentListener,
        AddEditFragment.AddEditFragmentListener {

    private static final String AUTHORITY = "com.iekproject.siegfried.libraryapp";

    //key for storing a book's Uri in a Bundle passed to a fragment
    public static final String BOOK_URI = "book_uri";

    private LibraryFragment libraryFragment; //displays library aka book list

    private File root;
    private ArrayList<File> fileList = new ArrayList<File>();
    private LinearLayout view;

    FloatingActionButton btn;
    int PICKFILE_RESULT_CODE=1;

    //displays LibraryFragment when MainActivity first loads
   @Override
    protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);
       //Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       //setSupportActionBar(toolbar);
       setContentView(R.layout.activity_main);

        //if layout contains fragmentContainer, the phone layout is in use. Create and display
        //a LibraryFragment
        if (savedInstanceState == null && findViewById(R.id.fragmentContainer) != null) {
            //create LibraryFragment
            libraryFragment = new LibraryFragment();

            //add the fragment to the FrameLayout
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.add(R.id.fragmentContainer, libraryFragment);
            transaction.commit(); //displays LibraryFragment
        }
        else {
            libraryFragment =
                    (LibraryFragment) getSupportFragmentManager().
                            findFragmentById(R.id.DetailFragment);
        }


       //view = (LinearLayout) findViewById(R.id.DetailFragment);

       //getting SDcard root path
       root = new File(Environment.getExternalStorageDirectory()
               .getAbsolutePath());
       getfile(root);

       for (int i = 0; i < fileList.size(); i++) {
           TextView textView = new TextView(this);
           textView.setText(fileList.get(i).getName());
           textView.setPadding(5, 5, 5, 5);

           System.out.println(fileList.get(i).getName());

           if (fileList.get(i).isDirectory()) {
               textView.setTextColor(Color.parseColor("#FF0000"));
           }
           view.addView(textView);
       }

       btn = (FloatingActionButton) findViewById(R.id.addButton);
       btn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
               intent.setType("file/*");
               startActivityForResult(intent,PICKFILE_RESULT_CODE);
           }
       });

   }

    public ArrayList<File> getfile(File dir) {
        File listFile[] = dir.listFiles();
        if (listFile != null && listFile.length > 0) {
            for (int i = 0; i < listFile.length; i++) {

                if (listFile[i].isDirectory()) {
                    fileList.add(listFile[i]);
                    getfile(listFile[i]);

                }
                else {
                    if (listFile[i].getName().endsWith(".mobi")
                            || listFile[i].getName().endsWith(".epub")) {
                        fileList.add(listFile[i]);
                    }
                }

            }
        }
    return fileList;
    }


        @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(resultCode==PICKFILE_RESULT_CODE){
                Log.d("TAG", "File Uri " +data.getData());
            }
        }


   public boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
   }

    //displays DetailFragment for selected book
    @Override
    public void onBookSelected(Uri bookUri) {
            getSupportFragmentManager().popBackStack();
            displayBook(bookUri, R.id.rightPaneContainer);
    }

    //displays AddEditFragment to add a new book. Possibly what I'll also have to change to make it
    //scan/update the book list
    @Override
    public void onAddBook() {
            displayAddEditFragment(R.id.rightPaneContainer, null);
    }

    //displays a book
    private void displayBook(Uri bookUri, int viewID) {
        DetailFragment detailFragment = new DetailFragment();

        //specify book's Uri as an argument to the DetailFragment
        Bundle arguments = new Bundle();
        arguments.putParcelable(BOOK_URI, bookUri);
        detailFragment.setArguments(arguments);

        //use a FragmentTransaction to display the DetailFragment
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(viewID, detailFragment);
        transaction.addToBackStack(null);
        transaction.commit(); //causes DetailFragment to display
    }

    //displays fragment for adding new or editing existing book
    private void displayAddEditFragment(int viewID, Uri bookUri) {
        AddEditFragment addEditFragment = new AddEditFragment();

        //if editing existing book, provide bookUri as an argument
        if (bookUri != null) {
            Bundle arguments = new Bundle();
            arguments.putParcelable(BOOK_URI, bookUri);
            addEditFragment.setArguments(arguments);
        }

        //use a FragmentTransaction to display the AddEditFragment
        FragmentTransaction transaction =
                getSupportFragmentManager().beginTransaction();
        transaction.replace(viewID, addEditFragment);
        transaction.addToBackStack(null);
        transaction.commit(); //causes AddEditFragment to display
    }

    //return to book list when displayed book deleted
    @Override
    public void onBookDeleted() {
        //removes top of back stack
        getSupportFragmentManager().popBackStack();
        libraryFragment.updateLibrary(); //refresh book list
    }

    //displays the AddEditFragment to edit an existing book. Maybe it can be used as Move or sth
   /*@Override
    public void onEditBook(Uri bookUri) {
        displayAddEditFragment(R.id.rightPaneContainer, bookUri);
    }*/

    //update GUI after the new book or updated book saved
    @Override
    public void onAddEditCompleted(Uri bookUri) {
        //removes top of back stack
        getSupportFragmentManager().popBackStack();
        libraryFragment.updateLibrary(); //refresh book list

        if (findViewById(R.id.fragmentContainer) == null){ //tablet
            //removes top of back stack
            getSupportFragmentManager().popBackStack();

            //on tablet, displays the book that was just added or edited
            displayBook(bookUri, R.id.rightPaneContainer);
        }
    }
}


Я в моем конце остроумия... Я пытался найти решение только для того, что я прошу помощи в течение примерно 2 дней, и я не могу потратить на это больше 2 дней, потому что у меня есть много других проектов (opengl, dreamweaver, больше java просто не в android studio и т. д.), Так что любая помощь будет очень признательна =D

Что я уже пробовал:

Почти все, что я пробовал, находится в коде, прокомментированном или на работе

Nick_3141592654

Пожалуйста, четко сформулируйте свою техническую проблему.

Так ли это:

1. Вы ожидали, что SD-карта в вашем эмуляторе будет соответствовать физической SD-карте на вашем устройстве, а не внутренней памяти?

или связано с тем, о чем вы упомянули:

2. Чтение конкретных книг, например, вы ищете какой-то файловый фильтр?

И еще одно: знаете ли вы на самом деле, что такое внутреннее и внешнее хранилище в Android? Эти термины не очень хорошо названы и могут вызвать много путаницы. Внутреннее хранилище - это часть системы памяти, которая является "локальной" для приложения, то есть доступна только внутри этого приложения и в этом смысле является внутренней. Внешнее хранилище - это *все * другие части системы памяти (за исключением внутреннего хранилища, связанного с другими приложениями). Не предполагайте, что внутренняя и внешняя соответствует физической памяти Flash и SD соответственно, потому что это не так.

Christi Az

1.я сделал толчок файлов через командную строку на SD-карту, но файлы при прохождении через приложение настроек эмулятора, похоже, находятся в Android SDK, построенном для x86, который имеет несколько папок, одна из которых-загрузки.

2. Фильтр файлов, поэтому у меня это:
(listFile[i]. getName (). endsWith (". mobi")
| / listFile[i]. getName (). endsWith (". epub")) {
fileList. add(listFile[i]);
хотя я не уверен, работает это или нет.

О, ладно, я этого не знал, спасибо, что все прояснили.

Nick_3141592654

Кроме того, если вы действительно пытаетесь получить доступ к внешнему хранилищу на Android Marshmallow или более поздней версии, вам нужно будет обработать явный запрос разрешения во время выполнения: в этих более поздних версиях Android вы не можете просто объявить все необходимые разрешения в манифесте и ожидать, что они будут предоставлены вашему приложению (некоторые разрешения в порядке, в зависимости от их последствий для безопасности).

Christi Az

Я добавил разрешение на AndroidManifest, как на запись, так и на чтение на внешнем носителе

1 Ответов

Рейтинг:
5

Nick_3141592654

Итак, когда вы говорите "push", вы говорите о команде ADB push - это очень отличается от того типа PUSH-сервиса, о котором, как я думал, вы говорите.

Давайте сначала подумаем о вашем втором вопросе: как сделать фильтрацию файлов. Есть простое решение с помощью Apache Commons IO File Utilities Это дополнительная библиотека Android, которую вы можете добавить в свой проект, она дополнит SDK и предоставляет набор очень полезных утилит, связанных с файлами, которые облегчат достижение нужной вам фильтрации.

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

Теперь вопрос о толкании файлов. Вы можете снова использовать отладчик (или android. util.Log), чтобы подтвердить абсолютный путь к внешнему хранилищу вашего устройства. Скорее всего, он доступен по адресу /storage/sdcard0. Используйте команду "adb shell", чтобы открыть оболочку и проверить, что вы можете перейти в этот каталог (например," cd /storage/sdcard0") и перечислить там некоторые файлы ("ls-l"). Предполагая, что затем вы можете выйти из оболочки и сделать свой толчок к этому абсолютному пути ("adb push < your files> < absolute path to ext storage>").


Christi Az

Добавлено библиотека которую вы рекомендовали придется потратить некоторое время пытаясь понять как ее использовать но тем не менее спасибо

Хорошо, я попробую нажать на файлы вот так, просто быстрый вопрос, как вы думаете, если я нажму их правильно (то есть в правильном хранилище), как только я нажму на кнопку, вместо того чтобы быть направленным в папку, в которой они хранятся, как это происходит сейчас, они появятся в виде списка на экране моего планшета?

Nick_3141592654

Вы хотите, чтобы файлы выглядели как значки приложений на экране вашего планшета? Если так, то нет, этого не произойдет.

Однако на вашем планшете должно быть приложение файлового менеджера, которое вы можете использовать для изучения файловой системы (хотя приложение по умолчанию вряд ли будет показывать системные области). На Marshmallow есть базовый вид проводника файлов, доступный в меню настроек (доступ здесь: http://www.greenbot.com/article/2996030/android/how-to-get-to-android-marshmallows-hidden-file-manager.html). На Android N простой файловый проводник аналогично доступен, но в этом случае вам нужны Настройки - & gt;Хранилище - & gt;исследовать (и это тоже очень приятно, давая доступ, я думаю, ко всей файловой системе).

Christi Az

Что я хочу сделать, так это нажать кнопку, чтобы он вошел в папку Storage->Explore->Downloads и загрузил в список все файлы mobi и epub, которые он там находит, с минимальной информацией (обложка, автор, название), как это делает простое аудиоприложение (вы знаете item1, item2, item3 и т. д.). Моя основная активность может идти совершенно неправильно, но пока я не найду способ получить доступ и загрузить информацию в эту папку, я не думаю, что смогу двигаться дальше.

Я не хочу, чтобы нажатие кнопки показывало мне другой экран, на котором слева написано "Открыть из" и есть некоторые папки, такие как SDCard, загрузки (которые по какой-то причине пусты, потому что, по-видимому, это не тот, который находится в хранилище>Explore), аудио, контакты, галерея и неподдерживаемое действие