Ошибка, когда показывает внешний каталог файлов в AlertDialog в android 6.0 (READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE)

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

В android 5.1, это прокрутив изображение в окне.

En android 5.1

В android 6.0, это прокрутив изображение в окне.

En android 6.0

SimpleFileDialog.java

public class SimpleFileDialog
{
private int FileOpen     = 0;
private int FileSave     = 1;
private int FolderChoose = 2;
private int Select_type = FileSave;
private String m_sdcardDirectory = "";
private Context m_context;
private TextView m_titleView1;
private TextView m_titleView;
public String Default_File_Name = "default.txt";
private String Selected_File_Name = Default_File_Name;
private EditText input_text;

private String m_dir = "";
private List m_subdirs = null;
private SimpleFileDialogListener m_SimpleFileDialogListener = null;
private ArrayAdapter m_listAdapter = null;

//////////////////////////////////////////////////////
// Callback interface for selected directory
//////////////////////////////////////////////////////
public interface SimpleFileDialogListener
{
    public void onChosenDir(String chosenDir);
}

public SimpleFileDialog(Context context, String file_select_type, SimpleFileDialogListener SimpleFileDialogListener)
{
    if (file_select_type.equals("FileOpen"))          Select_type = FileOpen;
    else if (file_select_type.equals("FileSave"))     Select_type = FileSave;
    else if (file_select_type.equals("FolderChoose")) Select_type = FolderChoose;
    else Select_type = FileOpen;

    m_context = context;
    m_sdcardDirectory = Environment.getExternalStorageDirectory().getAbsolutePath();
    m_SimpleFileDialogListener = SimpleFileDialogListener;

    try
    {
        m_sdcardDirectory = new File(m_sdcardDirectory).getCanonicalPath();
    }
    catch (IOException ioe)
    {
    }
}

///////////////////////////////////////////////////////////////////////
// chooseFile_or_Dir() - load directory chooser dialog for initial
// default sdcard directory
///////////////////////////////////////////////////////////////////////
public void chooseFile_or_Dir()
{
    // Initial directory is sdcard directory
    if (m_dir.equals(""))   chooseFile_or_Dir(m_sdcardDirectory);
    else chooseFile_or_Dir(m_dir);
}

////////////////////////////////////////////////////////////////////////////////
// chooseFile_or_Dir(String dir) - load directory chooser dialog for initial
// input 'dir' directory
////////////////////////////////////////////////////////////////////////////////
public void chooseFile_or_Dir(String dir)
{
    File dirFile = new File(dir);
    if (! dirFile.exists() || ! dirFile.isDirectory())
    {
        dir = m_sdcardDirectory;
    }

    try
    {
        dir = new File(dir).getCanonicalPath();
    }
    catch (IOException ioe)
    {
        return;
    }

    m_dir = dir;
    m_subdirs = getDirectories(dir);

    class SimpleFileDialogOnClickListener implements DialogInterface.OnClickListener
    {
        public void onClick(DialogInterface dialog, int item)
        {
            String m_dir_old = m_dir;
            String sel = "" + ((AlertDialog) dialog).getListView().getAdapter().getItem(item);
            if (sel.charAt(sel.length()-1) == '/')  sel = sel.substring(0, sel.length()-1);

            // Navigate into the sub-directory
            if (sel.equals(".."))
            {
                m_dir = m_dir.substring(0, m_dir.lastIndexOf("/"));
            }
            else
            {
                m_dir += "/" + sel;
            }
            Selected_File_Name = Default_File_Name;

            if ((new File(m_dir).isFile())) // If the selection is a regular file
            {
                m_dir = m_dir_old;
                Selected_File_Name = sel;
            }

            updateDirectory();
        }
    }

    AlertDialog.Builder dialogBuilder = createDirectoryChooserDialog(dir, m_subdirs,
            new SimpleFileDialogOnClickListener());

    dialogBuilder.setPositiveButton("Aceptar", new OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int which)
        {
            // Current directory chosen
            // Call registered listener supplied with the chosen directory
            if (m_SimpleFileDialogListener != null){
                {
                    if (Select_type == FileOpen || Select_type == FileSave)
                    {
                        Selected_File_Name= input_text.getText() +"";
                        m_SimpleFileDialogListener.onChosenDir(m_dir + "/" + Selected_File_Name);}
                    else
                    {
                        m_SimpleFileDialogListener.onChosenDir(m_dir);
                    }
                }
            }
        }
    }).setNegativeButton("Cancelar", null);

    final AlertDialog dirsDialog = dialogBuilder.create();

    // Show directory chooser dialog
    dirsDialog.show();
}

private boolean createSubDir(String newDir)
{
    File newDirFile = new File(newDir);
    if   (! newDirFile.exists() ) return newDirFile.mkdir();
    else return false;
}

private List getDirectories(String dir)
{
    List dirs = new ArrayList();
    try
    {
        File dirFile = new File(dir);

        // if directory is not the base sd card directory add ".." for going up one directory
        if (! m_dir.equals(m_sdcardDirectory) ) dirs.add("..");

        if (! dirFile.exists() || ! dirFile.isDirectory())
        {
            return dirs;
        }

        for (File file : dirFile.listFiles())
        {
            if ( file.isDirectory())
            {
                // Add "/" to directory names to identify them in the list
                dirs.add( file.getName() + "/" );
            }
            else if (Select_type == FileSave || Select_type == FileOpen)
            {
                // Add file names to the list if we are doing a file save or file open operation
                dirs.add( file.getName() );
            }
        }
    }
    catch (Exception e) {}

    Collections.sort(dirs, new Comparator()
    {
        public int compare(String o1, String o2)
        {
            return o1.compareTo(o2);
        }
    });
    return dirs;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////                                   START DIALOG DEFINITION                                    //////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
private AlertDialog.Builder createDirectoryChooserDialog(String title, List listItems,
                                                         DialogInterface.OnClickListener onClickListener)
{
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(m_context);
    ////////////////////////////////////////////////
    // Create title text showing file select type //
    ////////////////////////////////////////////////
    m_titleView1 = new TextView(m_context);
    m_titleView1.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    //m_titleView1.setTextAppearance(m_context, android.R.style.TextAppearance_Large);
    //m_titleView1.setTextColor( m_context.getResources().getColor(android.R.color.black) );

    if (Select_type == FileOpen    ) m_titleView1.setText("Open:");
    if (Select_type == FileSave    ) m_titleView1.setText("Save As:");
    if (Select_type == FolderChoose) m_titleView1.setText("Folder Select:");

    //need to make this a variable Save as, Open, Select Directory
    m_titleView1.setGravity(Gravity.CENTER_VERTICAL);
   // m_titleView1.setBackgroundColor(-12303292); // dark gray  -12303292
    m_titleView1.setTextColor( m_context.getResources().getColor(android.R.color.white) );

    // Create custom view for AlertDialog title
    LinearLayout titleLayout1 = new LinearLayout(m_context);
    titleLayout1.setOrientation(LinearLayout.VERTICAL);
    titleLayout1.addView(m_titleView1);


    if (Select_type == FolderChoose || Select_type == FileSave)
    {
        ///////////////////////////////
        // Create New Folder Button  //
        ///////////////////////////////
        Button newDirButton = new Button(m_context);
        newDirButton.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        newDirButton.setText("New Folder");
        newDirButton.setOnClickListener(new View.OnClickListener()
                                        {
                                            @Override
                                            public void onClick(View v)
                                            {
                                                final EditText input = new EditText(m_context);

                                                // Show new folder name input dialog
                                                new AlertDialog.Builder(m_context).
                                                        setTitle("New Folder Name").
                                                        setView(input).setPositiveButton("Aceptar", new DialogInterface.OnClickListener()
                                                {
                                                    public void onClick(DialogInterface dialog, int whichButton)
                                                    {
                                                        Editable newDir = input.getText();
                                                        String newDirName = newDir.toString();
                                                        // Create new directory
                                                        if ( createSubDir(m_dir + "/" + newDirName) )
                                                        {
                                                            // Navigate into the new directory
                                                            m_dir += "/" + newDirName;
                                                            updateDirectory();
                                                        }
                                                        else
                                                        {
                                                            Toast.makeText( m_context, "Failed to create '"
                                                                    + newDirName + "' folder", Toast.LENGTH_SHORT).show();
                                                        }
                                                    }
                                                }).setNegativeButton("Cancelar", null).show();
                                            }
                                        }
        );
        titleLayout1.addView(newDirButton);
    }

    /////////////////////////////////////////////////////
    // Create View with folder path and entry text box //
    /////////////////////////////////////////////////////
    LinearLayout titleLayout = new LinearLayout(m_context);
    titleLayout.setOrientation(LinearLayout.VERTICAL);

    m_titleView = new TextView(m_context);
    m_titleView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
  //  m_titleView.setBackgroundColor(-12303292); // dark gray -12303292
    m_titleView.setTextColor( m_context.getResources().getColor(android.R.color.white) );
    m_titleView.setGravity(Gravity.CENTER_VERTICAL);
    m_titleView.setText(title);

    titleLayout.addView(m_titleView);

    if (Select_type == FileOpen || Select_type == FileSave)
    {
        input_text = new EditText(m_context);
        input_text.setText(Default_File_Name);
        titleLayout.addView(input_text);
    }
    //////////////////////////////////////////
    // Set Views and Finish Dialog builder  //
    //////////////////////////////////////////
    dialogBuilder.setView(titleLayout);
    dialogBuilder.setCustomTitle(titleLayout1);
    m_listAdapter = createListAdapter(listItems);
    dialogBuilder.setSingleChoiceItems(m_listAdapter, -1, onClickListener);
    dialogBuilder.setCancelable(false);
    return dialogBuilder;
}

private void updateDirectory()
{
    m_subdirs.clear();
    m_subdirs.addAll( getDirectories(m_dir) );
    m_titleView.setText(m_dir);
    m_listAdapter.notifyDataSetChanged();
    //#scorch
    if (Select_type == FileSave || Select_type == FileOpen)
    {
        input_text.setText(Selected_File_Name);
    }
}

private ArrayAdapter createListAdapter(List items)
{
    return new ArrayAdapter(m_context, android.R.layout.select_dialog_item, android.R.id.text1, items)
    {
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            View v = super.getView(position, convertView, parent);
            if (v instanceof TextView)
            {
                // Enable list item (directory) text wrapping
                TextView tv = (TextView) v;
                tv.getLayoutParams().height = LayoutParams.WRAP_CONTENT;
                tv.setEllipsize(null);
            }
            return v;
        }
    };
}

MainActivity.java

public class MainActivity extends Activity implements
    AdapterContactos.customButtonListener {

TextView contenido;
ListView lista;
Button cargar,agregarTodos;

AdapterContactos adapter;
ArrayList contactos;
ArrayList contactos2;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    contenido = (TextView)findViewById(R.id.tvcontenido);
    lista = (ListView)findViewById(R.id.listview);
    cargar = (Button)findViewById(R.id.btrecuperar);
    agregarTodos = (Button)findViewById(R.id.btagregartodos);



    contactos = new ArrayList<>();
    contactos2 = new ArrayList<>();
    cargarDataBase();

    if(contactos2.isEmpty()){
        agregarTodos.setEnabled(false);
    }

    cargar.setOnClickListener(new Button.OnClickListener(){

        String m_chosen;
        @Override
        public void onClick(View v) {
            /////////////////////////////////////////////////////////////////////////////////////////////////
            //Create FileOpenDialog and register a callback
            /////////////////////////////////////////////////////////////////////////////////////////////////
            SimpleFileDialog FileOpenDialog =  new SimpleFileDialog(MainActivity.this, "FileOpen",
                    new SimpleFileDialog.SimpleFileDialogListener()
                    {
                        @Override
                        public void onChosenDir(String chosenDir)
                        {
                            // The code in this function will be executed when the dialog OK button is pushed
                            m_chosen = chosenDir;

                            contenido.setText(m_chosen);
                            Toast.makeText(MainActivity.this, "Archivo escogido File: " +
                                    m_chosen, Toast.LENGTH_LONG).show();
                        }
                    });

            //You can change the default filename using the public variable "Default_File_Name"
            FileOpenDialog.Default_File_Name = "";
            FileOpenDialog.chooseFile_or_Dir();

            /////////////////////////////////////////////////////////////////////////////////////////////////

        }
    });
}

Gradle

android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
defaultConfig {
    applicationId "com.example.carlos.lectura"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
}

8
задан 15.03.2017, 00:13
1 ответ

PeticiГіn разрешения WRITE_EXTERNAL_STORAGE

Одно из разрешений, которых требуют для Android 6.0, WRITE_EXTERNAL_STORAGE (который implГ-citamente tambiГ©n READ_EXTERNAL_STORAGE):

ты можешь требовать разрешения перед тем, как стараться читать внешнее хранение, пламя было mГ©todo:

private void checkExternalStoragePermission() {
    int permissionCheck = ContextCompat.checkSelfPermission(
            this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        Log.i("Mensaje", "No se tiene permiso para leer.");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 225);
    } else {
        Log.i("Mensaje", "Se tiene permiso para leer!");
    }
}

ты Можешь санкционировать называть методом только самые большие операционные системы или равный Android 6.0:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
    //Verifica permisos para Android 6.0+
     checkExternalStoragePermission();
}
5
ответ дан 24.11.2019, 13:18
  • 1
    Большое спасибо Elenasys ты большой!: D было справедливым то, в чем он нуждался, и уже функционируй – Carlos Hernández 24.09.2016, 23:22
  • 2
    Привет Карлос, он мне очень приятный, Привет! – Jorgesys♦ 24.09.2016, 23:25