Search code examples
androiddirectoryandroid-6.0-marshmallowmkdirmtp

Android API 23 mkdir created folder is shown as single file in windows explorer


So basically i create a folder with mkdir and then write a simple text file into that folder. As last step i use MediaScannerConnection.ScanFile to make them visible for the file explorer.

The folder and text file are both visible in my file explorer on my android phone.When connecting the phone to my windows 10 computer via USB using MTP i see all the other folders but my newly created folder is shown as a single File, no extensions, 4KB size.

Restarting Smartphone and computer do not resolve the issue but when i rename the folder in my android file explorer and then restart my phone it shows up as normal folder in windows explorer.

The App shows a dialog, after clicking a button, with a list of files to choose from to overwrite, edittext to enter new filename, negative button and positive button.

Here the Code:

 /*
Save Config in a File stored in interal storage --> which is emulated as external storage 0
Shows a Dialog window with the option to select a file which is already there or type in a name for a new file or choose from a list of files 
--> save the new file or cancel the dialog
*/
public void savebutton(View view) {

        try {
            // Instantiate an AlertDialog with application context this
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            //External Storage storage/emulated/0/Config --> storage/emulated/0 is internal storage emulated as sd-card
            dir = new File(Environment.getExternalStorageDirectory() + folder);
            if (!dir.exists()) {
                if (!dir.mkdir()) { //create directory if not existing yet
                    Log.d(MainActivity.LOG_TAG, "savebutton: directory was not created");
                }
            }

            //set title of dialog
            builder.setTitle("Save Configuration in Text File");
            //Add edittext to dialog
            final EditText input = new EditText(ConfigActivity.this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT);
            input.setLayoutParams(lp);
            input.setImeOptions(EditorInfo.IME_ACTION_DONE);        // instead of a RETURN button you get a DONE button
            input.setSingleLine(true);                              // single line cause more lines would change the layout
            java.util.Calendar c = java.util.Calendar.getInstance();
            int day = c.get(java.util.Calendar.DAY_OF_MONTH);
            int month = c.get(java.util.Calendar.MONTH) + 1;
            int year = c.get(java.util.Calendar.YEAR);
            String date = Integer.toString(day) + "." + Integer.toString(month) + "." + Integer.toString(year);
            String savename = name + "-" + date;
            input.setText(savename);

            //Append term + "=" + value --> like LevelOn=50
            for (int itemcounter = 0; itemcounter < value.length; itemcounter++)
                datastring += (term[itemcounter] + "=" + getvalue(itemcounter) + "\n");

            //File List of already stored files for dialog
            mFilelist = dir.list();
            builder.setItems(mFilelist, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                    mChosenFile = mFilelist[which]; // the item/file which was selected in the file list

                    try {
                        //Create text file in directory /Pump Config Files
                        File file = new File(dir.getAbsolutePath(), mChosenFile);
                        //create bufferedwrite with filewriter
                        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
                        //write to file --> an existing file will be overwritten
                        bw.write(datastring);
                        //Flush bufferedwriter
                        bw.close();
                        //LOG
                        System.out.println("Wrote to file");
                        //Show a message
                        Toast.makeText(getApplicationContext(), "Saved data", Toast.LENGTH_SHORT).show();

                        // initiate media scan -->cause sometimes created files are nt shown on computer when connected to phone via USB
                        // restarting the smartphone or rename folder can help too
                        // make the scanner aware of the location and the files you want to see
                        MediaScannerConnection.scanFile(
                                getApplicationContext(),
                                new String[]{dir.getAbsolutePath()},
                                null,
                                new MediaScannerConnection.OnScanCompletedListener() {
                                    @Override
                                    public void onScanCompleted(String path, Uri uri) {
                                        Log.v("LOG", "file " + path + " was scanned successfully: " + uri);
                                    }
                                });
                    } catch (Exception e) {
                        System.out.print(e.toString());
                    }
                    //dismissing the dialog
                    dialog.cancel();
                    dialog.dismiss();
                }
            });

            // Get the AlertDialog from builder create()
            AlertDialog dialog = builder.create();
            //Set dialog view/layout
            dialog.setView(input);

            //Add positive button to dialog
            //When pressing the positive button a file with the specified name and configurtion is stored on internal storage
            dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Save", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    try {
                        filename = input.getText().toString();
                        //Create text file in directory /Pump Config Files
                        File file = new File(dir.getAbsolutePath(), filename + ".txt");
                        //create bufferedwrite with filewriter
                        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
                        //write to file --> an existing file will be overwritten
                        bw.write(datastring);
                        //Flush bufferedwriter
                        bw.close();
                        //LOG
                        System.out.println("Wrote to file");
                        //Show a message
                        Toast.makeText(getApplicationContext(), "Saved data", Toast.LENGTH_SHORT).show();
                    } catch (Exception e) {
                        System.out.print(e.toString());
                    }
                    // initiate media scan -->cause sometimes created files are nt shown on computer when connected to phone via USB
                    // restarting the smartphone or rename folder can help too
                    // make the scanner aware of the location and the files you want to see
                    MediaScannerConnection.scanFile(
                            getApplicationContext(),
                            new String[]{dir.getAbsolutePath()},
                            null,
                            new MediaScannerConnection.OnScanCompletedListener() {
                                @Override
                                public void onScanCompleted(String path, Uri uri) {
                                    Log.v("LOG", "file " + path + " was scanned successfully: " + uri);
                                }
                            });

                    dialog.cancel();
                    dialog.dismiss();
                }
            });

            //Add negative button
            dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            //show the save dialog
            dialog.show();
        } catch (Exception e) {
            System.out.print(e.toString());
        }
    }

Tested on Android API 23 and API 21. Works fine on 21 but not on 23.


Solution

  • Thanks greenapps,

    new String[]{dir.getAbsolutePath()},. You should let scan the file instead: new String[]{file.getAbsolutePath()},

    works fine.

    I am always missing some small details like this.