web-dev-qa-db-ja.com

SDカードにディレクトリを自動的に作成する方法

ファイルを次の場所に保存しようとしています
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName);しかし私は例外Java.io.FileNotFoundExceptionを得ています
しかし、パスを"/sdcard/"にするとうまくいきます。

今私はこのように自動的にディレクトリを作成することはできないと思っています。

コードを使用してdirectory and sub-directoryを作成する方法を誰かが提案できますか?

184

最上位ディレクトリをラップする File オブジェクトを作成する場合は、 mkdirs() メソッドを呼び出して必要なディレクトリをすべて構築できます。何かのようなもの:

// create a File object for the parent directory
File wallpaperDirectory = new File("/sdcard/Wallpaper/");
// have the object build the directory structure, if needed.
wallpaperDirectory.mkdirs();
// create a File object for the output file
File outputFile = new File(wallpaperDirectory, filename);
// now attach the OutputStream to the file object, instead of a String representation
FileOutputStream fos = new FileOutputStream(outputFile);

注:これは変更される可能性があるため、 "SD Card"ディレクトリを取得するには Environment.getExternalStorageDirectory() を使用することをお勧めします。 SDカード以外のもの(内蔵フラッシュ、iPhoneなど)を持っている電話が付属している場合。どちらの方法でも、SDカードが取り外される可能性があるため、実際にそこにあることを確認するために確認する必要があることに留意する必要があります。

更新:API Level 4(1.6)以降、パーミッションもリクエストする必要があります。 (マニフェスト内の)このようなものでうまくいくはずです。

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
439
Jeremy Logan

同じ問題があり、AndroidManifest.xmlにもこの権限が必要であることを追加します。

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
57
Daniel

これは私のために働くものです。

 uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" 

マニフェストと以下のコードで

public static boolean createDirIfNotExists(String path) {
    boolean ret = true;

    File file = new File(Environment.getExternalStorageDirectory(), path);
    if (!file.exists()) {
        if (!file.mkdirs()) {
            Log.e("TravellerLog :: ", "Problem creating Image folder");
            ret = false;
        }
    }
    return ret;
}
39
Vijay Kumar A B

実際、@ fiXedd回答の一部を使用しましたが、うまくいきました。

  //Create Folder
  File folder = new File(Environment.getExternalStorageDirectory().toString()+"/Aqeel/Images");
  folder.mkdirs();

  //Save the path as a string value
  String extStorageDirectory = folder.toString();

  //Create New file and name it Image2.PNG
  File file = new File(extStorageDirectory, "Image2.PNG");

完全なパスを作成するには、mkdir()ではなくmkdirs()を使用していることを確認してください

24
Amt87

API 8以降では、SDカードの場所が変わりました。 @ fiXeddの答えは良いですが、より安全なコードのためには、メディアが利用可能かどうかをチェックするためにEnvironment.getExternalStorageState()を使うべきです。その後、getExternalFilesDir()を使用して目的のディレクトリに移動できます(API 8以降を使用していると仮定して)。

詳しくは SDKドキュメント をご覧ください。

12
Nick Ruiz

外部ストレージが存在することを確認してください: http://developer.Android.com/guide/topics/data/data-storage.html#filesExternal

private boolean isExternalStoragePresent() {

        boolean mExternalStorageAvailable = false;
        boolean mExternalStorageWriteable = false;
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // We can read and write the media
            mExternalStorageAvailable = mExternalStorageWriteable = true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            // We can only read the media
            mExternalStorageAvailable = true;
            mExternalStorageWriteable = false;
        } else {
            // Something else is wrong. It may be one of many other states, but
            // all we need
            // to know is we can neither read nor write
            mExternalStorageAvailable = mExternalStorageWriteable = false;
        }
        if (!((mExternalStorageAvailable) && (mExternalStorageWriteable))) {
            Toast.makeText(context, "SD card not present", Toast.LENGTH_LONG)
                    .show();

        }
        return (mExternalStorageAvailable) && (mExternalStorageWriteable);
    }
8
Parth mehta

私は同じ問題に直面しました。 Androidには2種類の権限があります。

  • 危険(連絡先へのアクセス、外部ストレージへの書き込み...)
  • 通常(通常の権限はAndroidによって自動的に承認されますが、危険な権限はAndroidユーザーによって承認される必要があります)。

これは、Android 6.0で危険な権限を取得するための戦略です。

  • あなたに許可が与えられているか確認してください
  • アプリに既に許可が与えられている場合は、先に進んで通常どおり実行してください。
  • アプリにまだ権限がない場合は、承認するようユーザーに依頼します。
  • onRequestPermissionsResultでユーザー承認を聞いてください

これが私の場合です。私は外部記憶装置に書き込む必要があります。

まず、許可があるかどうかを確認します。

...
private static final int REQUEST_WRITE_STORAGE = 112;
...
boolean hasPermission = (ContextCompat.checkSelfPermission(activity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
    ActivityCompat.requestPermissions(parentActivity,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);
}

次に、ユーザーの承認を確認します。

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case REQUEST_WRITE_STORAGE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
            }
        }
    }    
}
6
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();

これはあなたのSDカードにdorという名前のフォルダを作成します。次にdorフォルダに手動で挿入されたeg- filename.jsonのファイルを取得します。好きです:

 File file1 = new File(sdcard,"/dor/fitness.json");
 .......
 .....

<uses-permission Android:name = "Android.permission.WRITE_EXTERNAL_STORAGE" />

マニフェストにコードを追加することを忘れないでください

5
jayant singh

私は同じ問題に直面していました、ギャラクシーSの上にディレクトリを作成することができませんでしたが、Nexusとサムスンドロイドの上にそれをうまく作成することができました。次のようなコードを追加して修正しました。

File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
5

ファイル/フォルダ名に特殊文字が含まれていないことを確認することを忘れないでください。変数を使用してフォルダ名を設定していたときに ":"が表示されました

ファイル/フォルダ名に使用できない文字

"* /:<>?\ |

そのような場合、Uはこのコードが役に立つと思うかもしれません。

以下のコードはすべての ":"を削除し、それらを " - "に置き換えます。

//actualFileName = "qwerty:asdfg:zxcvb" say...

    String[] tempFileNames;
    String tempFileName ="";
    String delimiter = ":";
    tempFileNames = actualFileName.split(delimiter);
    tempFileName = tempFileNames[0];
    for (int j = 1; j < tempFileNames.length; j++){
        tempFileName = tempFileName+" - "+tempFileNames[j];
    }
    File file = new File(Environment.getExternalStorageDirectory(), "/MyApp/"+ tempFileName+ "/");
    if (!file.exists()) {
        if (!file.mkdirs()) {
        Log.e("TravellerLog :: ", "Problem creating Image folder");
        }
    }
5
Praveen
     //Create File object for Parent Directory
File wallpaperDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "wallpaper");
if (!wallpaperDir.exists()) {
wallpaperDir.mkdir();
}


File out = new File(wallpaperDir, wallpaperfile);
FileOutputStream outputStream = new FileOutputStream(out);
4
vikseln

Vijayの投稿を完了しました...


マニフェスト

uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"

機能

public static boolean createDirIfNotExists(String path) {
    boolean ret = true;

    File file = new File(Environment.getExternalStorageDirectory(), path);
    if (!file.exists()) {
        if (!file.mkdirs()) {
            Log.e("TravellerLog :: ", "Problem creating Image folder");
            ret = false;
        }
    }
    return ret;
}

使用法

createDirIfNotExists("mydir/"); //Create a directory sdcard/mydir
createDirIfNotExists("mydir/myfile") //Create a directory and a file in sdcard/mydir/myfile.txt

あなたはエラーをチェックすることができます

if(createDirIfNotExists("mydir/")){
     //Directory Created Success
}
else{
    //Error
}
3
Ismael Di Vita

これはあなたが提供するフォルダ名でSDカードにフォルダを作成します。

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name");
        if (!file.exists()) {
            file.mkdirs();
        }
3
Shweta Chauhan

Environment.getExternalStorageDirectory()の代わりに/ sdcard /を使用できます。

private static String DB_PATH = "/sdcard/Android/data/com.myawesomeapp.app/";

File dbdir = new File(DB_PATH);
dbdir.mkdirs();
1
Peter Drinnan
ivmage.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(
                    Intent.ACTION_PICK,
                    Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(i, RESULT_LOAD_IMAGE_ADD);

        }
    });`
1