web-dev-qa-db-ja.com

Android:外部ストレージのmkdirs()/ mkdir()がfalseを返す

私はこれに夢中です:

_Log.d("STATE", Environment.getExternalStorageState());
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "work_data");
Log.d("PATH", f.getAbsolutePath());
if (!f.exists()) {
    Log.d("MAKE DIR", f.mkdirs() + "");
}
_

出力ログは次のようになります。

_STATE     mounted
PATH      /mnt/sdcard/DCIM/work_data
MAKE DIR  false
_

正しい権限を追加するようにしました:

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

しかし、フォルダを作成できなかった理由はわかりません。 mkdir()も段階的に使用しましたが、結果は同じです。私を助けてください。私はそんなにググって、この愚かなことに少なくとも2日を費やしました。ご協力いただきありがとうございます!!

編集:

みんなごめんね! _<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>_タグに_<application>_を追加しました。これは私の間違いでした!しかし、返信ありがとうございます。

34
MHM

私は同じ問題を抱えていて、答えを見つけるために1週間すべてを検索しました。私はそれを見つけたと思いますし、それは途方もなく簡単だと思います。uses-permissionステートメントを適切な場所に配置する必要があります...

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.company.name" 
    Android:versionCode="1"
    Android:versionName="0.2">

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

<application> </ application>セクション内で使用した場合、機能しませんでした。

30
Omnivore

同じ問題が発生しましたが、許可タグを適切な場所に配置したはずですが、mkdirsはまだ機能しませんでした。私のシステムはAndroid 6.0、今すぐ解決します、あなた以下のように確認できます:

  1. 許可タグを必ずに入れてください。
  2. 電話で「設定/アプリケーション」を開き、アプリケーションの権限を確認します(マニフェストステートメントに権限がここにないことを確認しました)、このような権限のスイッチを開きます(「mkdirs」を作成するデフォルトで閉じられていることがわかりました)失敗した)

enter image description here

58
Fido Zhang

私はこれが古い投稿であることを知っていますが、おそらく私の答えは誰かを助けることができます。

この問題に対処して数日後、電話がPCに接続されている間、それは常に開発中になりますが、SDカードは利用できないことに気付きました。したがって、その上にディレクトリまたはファイルを作成しようとすると失敗します。 「より簡単に」するには、テスト中の電話によって動作が異なるように見えました。

私はそれがかなりばかげた問題に聞こえるかもしれないことを知っています、しかしそれはおそらく他の人が救うことができるであろう多くの時間を要しました。

15
Clark Ku

onCreate()にこのコード行を追加します

ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
11
Osama Ibrahim

mkdirs()は、ディレクトリが作成された場合にのみtrueを返します。すでに配置されている場合は、falseを返します。だから私はこのディレクトリがすでに存在しているに違いない。

5
dragonroot

Android 6.0以上の場合は、22未満のGradleファイルでターゲットSDKを確認してください。

targetSdkVersion 22

または、ランタイム権限を実装する必要があります。

2
phnmnn

これを入れて

Log.d("MAKE DIR", f.mkdir() + "");

の代わりに

Log.d("MAKE DIR", f.mkdirs() + "");

またはこれを試してください

String s=Environment.getExternalStorageDirectory().toString()+"/";
File f = new File(s+"DCIM/work_data");

あなたのコードは私にとってはうまく機能しています。コードに問題はありません。 1つのディレクトリを作成する場合でも、f.mkdir()の代わりにf.mkdirs()を使用します。mnt => Sd card => DCIM => work_dataでフォルダを確認できます

2
Dharmendra

同じ問題があり、修正を共有したかっただけです。 Android Android 4.4で始まるので、アプリのプライベートディレクトリ内のファイルの読み取りまたは書き込みには、READ_EXTERNAL_STORAGEまたはWRITE_EXTERNAL_STORAGE権限は必要ありません。 =

したがって、Android maxSdkVersion属性を追加することにより、Android $ ===の下位バージョンでのみ権限がリクエストされるように宣言できます:

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

しかし、maxSdkVersionが問題で、削除しただけで機能します。

2
Manish Jain

これは将来誰かを助けるかもしれません。

問題は、代わりに「/ File/Address /」というアドレスを書き込むことかもしれません。

File.separator + "File" + File.separator + "Address" + File.separator

これはとても小さくて愚かなことですが、何時間もの時間を浪費した後、これは私にとってはうまくいきました。

1
Mayank

Mkdirs()がfalseを返し続けたときに、外部ストレージ 'Test/Test1/Test2'に一連のサブフォルダーを作成しようとしました。 「Test」は、外部ストレージルート内のフォルダー用に予約されたWordであることがわかります。これはMotorola G(XT1541)を使用していたため、他のデバイスにも適用される可能性があります。

新しいデバイスの場合は、ユーザーに許可を求める必要があります。

ファイルを作成する前に、次のように行うことができます。

            boolean hasPermission = (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
        if (!hasPermission) {
            //ask permission
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_WRITE_STORAGE);
        }
        else {

           //you have permission, create your file
        }

ユーザーのアクションの後で、結果を処理できます。

  @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case 1: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //you have permission, create your file
                //reload my activity with permission granted or use the features what required the permission
            } else
            {
                Toast.makeText(MainActivity.this, "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();
            }
        }
    }

}
0
Pedro Henrique