2011-12-21 186 views
5

嗨有一種方法來選擇用戶想要在android中保存文件的文件夾。我檢查了http://code.google.com/p/android-file-dialog/如何在android中選擇文件夾?

它具有以下功能:選擇文件,但我要選擇的文件夾,請給我提供有用的鏈接或例子。

+0

您可以創建目錄編程 – 2011-12-21 09:10:56

+0

我建議你創建自己的文件/文件夾選擇器,並意圖調用它。它有點乏味,但是你控制着你的代碼,你可以從你的未來應用程序中調用它。否則,請通過Intents尋找具有公共API的第三方filexplorer。 – 2011-12-21 09:37:58

回答

0

我用同樣的源在我的應用程序(很肯定),並有一個代碼塊:

protected void onListItemClick(ListView l, View v, int position, long id) { 
    if (file.isDirectory()) { 
     selectButton.setEnabled(false); 
     if (file.canRead()) { 
      lastPositions.put(currentPath, position); 
      getDir(path.get(position)); 
     } else { 
      new AlertDialog.Builder(this) 
        .setIcon(R.drawable.icon) 
        .setTitle(
          "[" + file.getName() + "] " 
            + getText(R.string.cant_read_folder)) 
        .setPositiveButton("OK", 
          new DialogInterface.OnClickListener() { 

           @Override 
           public void onClick(DialogInterface dialog, 
             int which) { 

           } 
          }).show(); 
     } 
    } else { 
     selectedFile = file; 
     v.setSelected(true); 
     selectButton.setEnabled(true); 
    } 
} 

你只需要編輯它如何處理的if (file.isDirectory())。我建議在您的活動中聲明一個boolean值,如果該文件是一個目錄並且它已經是false,則更改爲true。然後如果所述值爲真,則遍歷該目錄。此外,當您將所述值更改爲true時,您需要致電selectButton.setEnabled(true)。這會比製作自己的代碼複雜得多,我會說。

+0

請爲我提供修改後的代碼。 – 2011-12-21 12:05:19

+0

if(file.isDirectory()){selectedFile = file; \t \t v.setSelected(true); selectButton.setEnabled(true); (file.canRead()){\t \t \t lastPositions.put(currentPath,position); GETDIR(path.get(位置));}其他{新AlertDialog.Builder(本)\t \t .setIcon(R.drawable.icon).setTitle(\t \t \t \t \t 「[」 + file.getName()+ 「]」+ getText(R.string.cant_read_folder))\t \t \t \t \t .setPositiveButton(「OK」,new DialogInterface。OnClickListener(){ 公共無效的onClick(DialogInterface對話框,\t \t \t \t \t \t \t \t \t \t INT其中){\t \t \t \t \t \t \t \t} \t \t \t \t \t \t \t \t})表示(); }} 其他{\t \t \t \t \t \t v.setSelected(false); \t \t \t selectButton.setEnabled(假);} – 2011-12-21 12:29:22

+0

我已經修改功能同上,但是我要選擇文件夾中的文件發生的,它返回以前的目錄時,我遍歷目錄層次結構。 – 2011-12-21 12:31:00

1

如何使用OI File Manager?這個應用程序有以下意圖:PICK_FILEPICK_DIRECTORY。 在頁面上甚至有使用Intents的示例代碼。

+2

我認爲問題旨在解決方案集成,而不是使用外部應用程序。 – 2013-08-04 18:25:39

0

我遇到了同樣的問題,我最終使用NoNonsense-FilePicker

添加到搖籃文件

編譯 'com.nononsenseapps:filepicker:4.0.0'

觸發文件/文件夾/目錄選

try { 

        Utils.makeHepticFeedback(getActivity()); 

        Intent selectDirectoyIntent = new Intent(getActivity(), FilePickerActivity.class); 
        selectDirectoyIntent.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false); 
        selectDirectoyIntent.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, true); 
        selectDirectoyIntent.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_DIR); 
        selectDirectoyIntent.putExtra(FilePickerActivity.EXTRA_START_PATH, Environment.getExternalStorageDirectory().getPath()); 
        startActivityForResult(selectDirectoyIntent, FILE_CODE); 

       } catch (Exception e) { 
        Log.e(LOG_TAG, "exception", e); 
        e.printStackTrace(); 

        Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_SHORT).show(); 
       } 

Handle Act ivity結果得到選定的文件或文件

@Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 

      if (resultCode == Activity.RESULT_OK && requestCode == CHOOSE_IMAGE_REQUEST_CODE) { 
       Uri selectedImageUri = data.getData(); 
       String selectedImagePath = getRealPathFromURI(selectedImageUri); 


       // NOW WE HAVE OUR WANTED STRING 
       if (selectedImagePath != null) { 
        System.out 
          .println("selectedImagePath is the right one for you!"); 

        PreferenceHelper.getPreferenceHelperInstance().setString(getActivity(), 
          PreferenceHelper.PLAYER_BACKGROUND, 
          selectedImageUri.toString()); 

        Glide.with(getActivity()).load(Uri.parse(
          PreferenceHelper.getPreferenceHelperInstance().getString(getActivity(), 
            PreferenceHelper.PLAYER_BACKGROUND 
            , AppConstants.DEFAULT_BACKGROUND_URL))). 
          into((ImageView) ButterKnife.findById(getActivity(), R.id.play_back)); 

       } 
      } else if (requestCode == FILE_CODE && resultCode == Activity.RESULT_OK) { 

       if (null != data && !data.getBooleanExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false)) { 
        // The URI will now be something like content://PACKAGE-NAME/root/path/to/file 
        Uri uri = data.getData(); 
        // A utility method is provided to transform the URI to a File object 
        File file = com.nononsenseapps.filepicker.Utils.getFileForUri(uri); 
        // If you want a URI which matches the old return value, you can do 
        Uri fileUri = Uri.fromFile(file); 
        // Do something with the result... 

        Snackbar.make(fileFormat, "Recording folder updated to" + fileUri.getPath() + " ¯\\_(ツ)_/¯ ", Snackbar.LENGTH_SHORT).show(); 

        AppConfig.RECORDING_FOLDER = fileUri.getPath(); 

        PreferenceHelper.getPreferenceHelperInstance().setString(getActivity(), PreferenceHelper.RECORDING_FOLDER, AppConfig.RECORDING_FOLDER); 

        setUpSettingValue(); 

       } else { 

        // Handling multiple results is one extra step 
        ArrayList<String> paths = data.getStringArrayListExtra(FilePickerActivity.EXTRA_PATHS); 
        if (paths != null) { 
         for (String path : paths) { 
          Uri uri = Uri.parse(path); 
          // Do something with the URI 
          File file = com.nononsenseapps.filepicker.Utils.getFileForUri(uri); 
          // If you want a URI which matches the old return value, you can do 
          Uri fileUri = Uri.fromFile(file); 
          // Do something with the result... 

          Toast.makeText(getActivity(), "Selected dir" + fileUri.getPath(), Toast.LENGTH_SHORT).show(); 


         } 
        } 
       } 
      } 

     } 
+0

'Utils.makeHepticFeedback(getActivity());'未發現方法。如果我評論說,我發現了一個異常 '了java.lang.RuntimeException:無法啓動活動ComponentInfo {} com.myapp.app/com.nononsenseapps.filepicker.FilePickerActivity:android.view.InflateException:二進制XML文件中的行#0:二進制XML文件行#0:錯誤充氣類ImageButton' 任何想法? – 2018-02-14 15:42:16

+1

Utils.makeHepticFeedback(getActivity())是方法,使設備振動,給一個按鈕覺得它什麼都沒有做與文件選擇器。你可以評論它。這似乎是一個UI問題https://stackoverflow.com/questions/35448999/error-inflating-class-imagebutton – 2018-02-22 04:55:38

相關問題