0

私のアプリケーションでは、ストレージの DirectoryPath を常に使用します。私のMAINでは、最初にディレクトリを作成しています。これを文字列に保存して、実際のデータベースを作成するときなど、他の方法で使用したいのですが、このパスに作成したいです。私はみんなの推奨事項にうんざりしていて、代わりにブール値を返しています。その値をまったく使用するかどうかはわかりません。

ここに私が持っているものがあります:

    private static boolean mCreateDatabaseDirectory(String dbPath) {
    boolean directoryCreated = true;
    boolean mExternalStorageAvailable = false;
    boolean mExternalStorageWriteable = false;


    Log.d("GENERAL", "Moving to mExternalStorageAvailable");
    mExternalStorageAvailable();
    Log.d("GENERAL", "Returning values of Available and Writeable");
    if(mExternalStorageAvailable = mExternalStorageWriteable = true){
        Log.d("GENERAL", "Booleans are True, creating Directoy");

        File directoryPath = new File(Environment.getExternalStorageDirectory().toString()+"/APP/database");
        Log.d("GENERAL", "directoryPath = " + directoryPath);

        if(!directoryPath.exists()) {
            directoryPath.mkdirs();
            String databasePath = directoryPath.toString();
            Log.d(DATABASE, "Database directory path created as " + databasePath);

                //If we try to create the file but there is a problem then Log the error
                if(!directoryPath.mkdirs()){
                    Log.e("DATABASE", "Problem creating Database Directory");
                    directoryCreated = false;   
                }

                Log.d("GENERAL", "Directory did not exist but was created");
                return directoryCreated;

        }else {
        Log.d("GENERAL", "Directory already exists, nothing to do here");
        return directoryCreated;    
     }
    }
    return directoryCreated;
}

もう1つの問題は、これが実際にSDCARDにディレクトリを作成しないことです。/storage/emulated/0/APP/database にディレクトリを作成します。これは、おそらく外部として指定された内部ストレージであると想定しています。このアプリが 100 MB 以上のデータベースの作成を開始し、スペースがない場合、それは問題になります。どうすれば SDCARD にアクセスできますか?

私の何百万ものコメントを無視してください。NullPointer エラーをデバッグしていて、具体的にどの行が問題であるかを特定する必要がありました。後で消去します。

4

1 に答える 1

0

これをエミュレーターまたは電話でテストしましたか? どちらの場合も、SD カードはマウントされていますか? SDカードがマウントされていない場合、Environment.getExternalStorageDirectory()は使用可能なデータフォルダーを返しますか? を使用する必要があると思いますgetExternalFilesDir。JellyBean およびマルチユーザー環境の時点で、ドキュメントに記載されているように動作が変更されました: developer.android.com/about/versions/android-4.2.html。外部 SD カードがマウントされていることを確認するには、次を使用します。getExternalStorageState

返された FilePath を文字列に変換し、Logcat に出力する小さなスニペットを次に示します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String getDataDirectory = Environment.getDataDirectory().toString();
    String getExternalStorageState = Environment.getExternalStorageState()
            .toString();
    String getExternalStorageDirectory = Environment
            .getExternalStorageDirectory().toString();
    String getExternalStoragePublicDirectory = Environment
            .getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_DOCUMENTS).toString();
    String getExternalFilesDir = getExternalFilesDir("Documents")
            .toString();

    Log.i("INFO", "getDataDirectory " + getDataDirectory);
    Log.i("INFO", "getExternalStorageState " + getExternalStorageState);
    Log.i("INFO", "getExternalStorageDirectory "
            + getExternalStorageDirectory);
    Log.i("INFO", "getExternalStoragePublicDirectory Documents "
            + getExternalStoragePublicDirectory);
    Log.i("INFO", "getExternalFilesDir Documents " + getExternalFilesDir);

    setContentView(R.layout.activity_main);
}

http://developer.android.com/reference/android/os/Environment.html段落フィールドgetExternalStoragePublicDirectoryに記載されている正しい定数を使用していることを確認してください。

于 2014-06-19T10:51:57.527 に答える