Поиск определенных типов файлов из хранилища эмулятора [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, как на запись, так и на чтение на внешнем носителе