web-dev-qa-db-ja.com

/ sdcardにディレクトリを作成すると失敗する

プログラムで/sdcardにディレクトリを作成しようとしましたが、機能していません。以下のコードは常にdirectory not created.を出力します

boolean success = (new File("/sdcard/map")).mkdir(); 
if (!success) {
    Log.i("directory not created", "directory not created");
} else {
    Log.i("directory created", "directory created");
}
55
sajjoo

ここで考慮すべき3つのことがあります。

  1. Sdカードが/sdcardにマウントされていると想定しないでください(デフォルトの場合に当てはまる場合がありますが、ハードコードしない方がよいでしょう)。システムにクエリを実行して、SDカードの場所を取得できます。

    Environment.getExternalStorageDirectory();
    
  2. AndroidManifest.xmlファイルにuses-permissionエントリを追加して、アプリケーションが外部ストレージに書き込む必要があることをAndroidに通知する必要があります。

    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  3. このディレクトリが既に存在する場合、mkdirはfalseを返します。そのため、ディレクトリの存在を確認し、存在しない場合は作成してみてください。コンポーネントで、次のようなものを使用します。

    File folder = new File(Environment.getExternalStorageDirectory() + "/map");
    boolean success = true;
    if (!folder.exists()) {
        success = folder.mkdir();
    }
    if (success) {
        // Do something on success
    } else {
        // Do something else on failure 
    }
    
150
Gopinath

Android電話を6.0(APIレベル23)に更新した後、同じ問題が発生しました。次の解決策が機能します。

Androidバージョン。6.0以上(APIレベル23)の場合は、含めるだけでなく、

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

androidManifest.xmlで、mkdir()を呼び出す前に許可をリクエスト。コードのスナップショット。

public static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
public int mkFolder(String folderName){ // make a folder under Environment.DIRECTORY_DCIM
    String state = Environment.getExternalStorageState();
    if (!Environment.MEDIA_MOUNTED.equals(state)){
        Log.d("myAppName", "Error: external storage is unavailable");
        return 0;
    }
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        Log.d("myAppName", "Error: external storage is read only.");
        return 0;
    }
    Log.d("myAppName", "External storage is not read only or unavailable");

    if (ContextCompat.checkSelfPermission(this, // request permission when it is not granted. 
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
        Log.d("myAppName", "permission:WRITE_EXTERNAL_STORAGE: NOT granted!");
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

        } else {

            // No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }
    File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),folderName);
    int result = 0;
    if (folder.exists()) {
        Log.d("myAppName","folder exist:"+folder.toString());
        result = 2; // folder exist
    }else{
        try {
            if (folder.mkdir()) {
                Log.d("myAppName", "folder created:" + folder.toString());
                result = 1; // folder created
            } else {
                Log.d("myAppName", "creat folder fails:" + folder.toString());
                result = 0; // creat folder fails
            }
        }catch (Exception ecp){
            ecp.printStackTrace();
        }
    }
    return result;
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

詳細については、「 実行時に権限をリクエストする 」をお読みください。

26
Diiiiii

SDカードへの正しいパスは

/mnt/sdcard/

しかし、前に答えたように、ハードコーディングするべきではありません。 Android 2.1以降の場合は、

getExternalFilesDir(String type) 

そうでなければ:

Environment.getExternalStorageDirectory()

注意深くお読みください https://developer.Android.com/guide/topics/data/data-storage.html#filesExternal

また、このメソッドまたは類似のものを使用する必要があります

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;
}

次に、SDカードにアクセスできるかどうかを確認します。前述のように、公式ドキュメントを読んでください。

別のオプション、おそらく mkdir の代わりに mkdirs を使用する必要がある

file.mkdirs()

このディレクトリの作成に必要な完全なディレクトリパスを含む、このファイルの末尾のファイル名で指定されたディレクトリを作成します。

16
Maragues

再起動 your Android device。デバイスを再起動した後、物事は私のために機能し始めました。

15
Uriel Frankel

これがAndroid 6でコンパイルターゲット> = 23で発生している場合は、 実行時のアクセス許可 を使用していることを忘れないでください。もう十分ではありません。

7
Kuno

mkdir()の代わりにmkdirs()を使用してください。

File folder = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA");
if(!folder.exists()){
    if(folder.mkdirs())
    Toast.makeText(this, "New Folder Created", Toast.LENGTH_SHORT).show();
}

File sdCardFile = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA/cgpa.html");
6
Bala Vishnu

in Android api> = 23

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

の代わりに

    <app:uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
2
Vahe Gharibyan

マニフェストでSDカードに書き込むための適切な権限がありますか? http://developer.Android.com/reference/Android/Manifest.permission.html でWRITE_EXTERNAL_STORAGEを探します

1
Matthieu

すでに作成されていませんか?フォルダーが既に存在する場合、mkdirはfalseを返します mkdir

1
fedj

心配する必要があるものがたくさんあります1。Android Bellow Marshmallowを使用している場合、マニフェストファイルにパーミションを設定する必要があります。2. Androidは、MarshmallowからOreoへの移行を意味します。AppInfoに移動し、ストレージのApp権限を手動で設定する必要があります。実行時に設定する場合は、以下のコードで実行できます。

public  boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
    if (checkSelfPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED) {
        Log.v(TAG,"Permission is granted");
        return true;
    } else {

        Log.v(TAG,"Permission is revoked");
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        return false;
    }
}
else { //permission is automatically granted on sdk<23 upon installation
    Log.v(TAG,"Permission is granted");
    return true;
}

}

1
Nadeem Bhat

私は両方を含めるのを間違えました:

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

そして:

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

上記の順序で。したがって、2番目の許可(READ)を削除すると、問題はなくなりました。

0
user2638345
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
        + "/FoderName");
if (!f.exists()) {
    f.mkdirs();
}
0
ashvin sapariya