0

私はいくつかの写真を撮るAndroidアプリケーションを書いていますが、それらすべてを私のアプリケーションに関連付けられた一意のディレクトリに保存したいと思います。

このディレクトリは、ユーザーが後で(アプリケーションが必ずしも実行されていない場合)撮影された写真を確認できるように、標準のギャラリーからアクセスできる必要があります。

私の問題は、Androidのバージョンが異なるすべての電話ベンダーがギャラリーのパスを持っていることです。例として:

Environment.getExternalStorageDirectory() + Environment.DIRECTORY_PICTURES +"/myFolder"

Samsung Galaxy Nexus実行android 4.1.1中およびAsus Transformer Pad実行中は機能しますが、実行中は機能しandroid 4.0.3ません。HTC Desireandroid 2.3.5

これにより、以下に示すように、指定されたパス内に新しいディレクトリを保存しようとすると、アプリケーションがクラッシュします。

boolean success = false;
myFolder = new File( Environment.getExternalStorageDirectory() + Environment.DIRECTORY_PICTURES + "/myFolder" );

if( myFolder.exists() ){
//do nothing        
}else{

    success = dvaFolder.mkdir();

if( success ){
    // Do something on success
    /*
     * folder has been created
     */

} else {
    // Do something else on failure 
    /*
     * folder creation failed
     */
    throw new RuntimeException("File Error in writing new folder");
}
}

すべての異なるベンダーとAndroidバージョンのギャラリーでアクセスできるディレクトリを作成するにはどうすればよいですか?

ノート:

Logcatはあまり役に立ちません。実行時の例外を返すだけなので、

4

3 に答える 3

1

写真を撮って外部ストレージに保存するための作業コードと、デバイスの「ファイル」ディレクトリに保存するための別の方法を次に示します。私の場合、必要な画像は1つ(something.png)で、ユーザーが新しい写真を撮った後に常に更新されます。

ユーザーがカメラのボタンをクリックしたときのアクション:

ImageView productImageView = (ImageView) findViewById(R.id.imageView1);
static int RESULT_TAKE_PICTURE = 1;
String selectedImagePath;
Bitmap bitmap;
String imageName = "something.png";

public void cameraImageButton_onClick(View view) {
    Intent cameraIntent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    String path = Environment.getExternalStorageDirectory()
            + File.separator + Environment.DIRECTORY_PICTURES;
    File dir = new File(path);
    if (!dir.exists()) {
        dir.mkdir();
    }
    dir = new File(path, imageName);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(dir));
    startActivityForResult(cameraIntent, RESULT_TAKE_PICTURE);
}

アクティビティ結果に対して実行されるアクション:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_TAKE_PICTURE && resultCode == RESULT_OK) {

        selectedImagePath = Environment.getExternalStorageDirectory()
                + File.separator + Environment.DIRECTORY_PICTURES
                + File.separator + imageName;

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(selectedImagePath, options);
        options.inSampleSize = Calculator.calculateInSampleSize(options,
                254, 254);
        options.inJustDecodeBounds = false;
        bitmap = BitmapFactory.decodeFile(selectedImagePath, options);
        productImageView.setImageBitmap(bitmap);

        saveImage(bitmap, imageName);

    }

}

誰かが必要な場合にファイルディレクトリのデバイスに画像を保存するためのボーナス方法:

private void saveImage(Bitmap bitmap, String name) {
    String path = getApplicationContext().getFilesDir().toString()
            + File.separator;
    File dir = new File(path);

    if (!dir.exists()) {
        dir.mkdir();
    }

    path = path + name;
    dir = new File(path);

    try {
        dir.createNewFile();
        FileOutputStream fos = new FileOutputStream(dir);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        fos.close();
        fos.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
于 2013-02-19T19:32:34.513 に答える
1

私はbluetoothフォルダーで同じ問題を抱えていました。電話のファイル構造全体をトラバースすることにより、電話のbluetoothフォルダーを検索する2つの方法を作成しました。私が書いたコードは下にあります。少し汚れていますが、私の場合は非常にうまく機能します

public List<File> folderSearchBT(File src, String folder) {

    List<File> result = new ArrayList<File>();

    File[] filesAndDirs = src.listFiles();


    if (filesAndDirs != null && filesAndDirs.length > 0) {
        List<File> filesDirs = Arrays.asList(filesAndDirs);

        for (File file : filesDirs) {
            result.add(file); // always add, even if directory
            if (file.isDirectory()) {
                List<File> deeperList = folderSearchBT(file, folder);
                result.addAll(deeperList);
            }
        }
    }
    return result;
}

このメソッドで上記のメソッドを使用します。

public String searchForGallery() {

    String splitchar = "/";
    File root = Environment.getExternalStorageDirectory();
    List<File> btFolder = null;
    String folder = "gallery"; //your foldername to search for..
    btFolder = folderSearchBT(root, folder);

    if(btFolder.size() < 1)
        Log.i("btFolder: ", "Empty");

    for (int i = 0; i < btFolder.size(); i++) {

        String g = btFolder.get(i).toString();

        String[] subf = g.split(splitchar);

        String s = subf[subf.length - 1].toUpperCase();

        boolean equals = s.equalsIgnoreCase(folder);

        if (equals)
            return g;
    }
    return null; //not found
}

コードが汚れているということは、コードをよりコンパクトに書くことができ、この方法で別の問題を作成できることを意味します: bluetooth という名前のフォルダーが 2 つある場合、行き詰まります..

あなたの質問が正しく理解できたことを願っています。

于 2012-09-26T10:38:25.597 に答える
0

アプリケーションのマニフェストに「WRITE_EXTERNAL_STORAGE」権限が含まれていることを確認する必要があります。このようなエラーが発生する可能性があります。また、パスを印刷して単に無効に見えないことを確認しましたか?

于 2012-09-26T09:59:14.630 に答える