4

Gallery3D(フローズンヨーグルト)を使用しています

ギャラリービューの特定のフォルダの画像のみを表示する小さなアプリを作成しようとしています。

Uri targetUri = Media.EXTERNAL_CONTENT_URI;
String folderPath = Environment.getExternalStorageDirectory().toString() + "/DCIM/";
int folderBucketId = folderPath.toLowerCase().hashCode();
targetUri = targetUri.buildUpon().appendQueryParameter("bucketId", String.valueOf(folderBucketId)).build();

initializeDataSource()

// Creating the DataSource objects.
final LocalDataSource localDataSource = new LocalDataSource(Gallery.this, targetUri.toString(), false);

しかし、私はエラーがあります

"Error finding album " + bucketId);

CacheService.loadMediaSets.

 Log.e(TAG, "Error finding album " + bucketId);

どうすればこれを修正できますか?ありがとうございました

4

2 に答える 2

2

フォルダーの下のファイルのパスを見つける必要があると仮定します。

    private String[] mFileStrings;
private File[] listFile;

public void getFromSdcard()
{
    File file=  new File(android.os.Environment.getExternalStorageDirectory(),"Your Folder Name");

        if (file.isDirectory())
        {
            listFile = file.listFiles();
            mFileStrings = new String[listFile.length];

            for (int i = 0; i < listFile.length; i++)
            {
                mFileStrings[i] = listFile[i].getAbsolutePath();
                System.out.println("...................................."+mFileStrings[i]);
            }
        }
}

私の電話では、内部メモリの名前は sdcard0 でした。したがって、正しいパスを確実に取得するには、以下のコードを使用できます。

 String externalpath = new String();
 String internalpath = new String();

public  void getExternalMounts() {
Runtime runtime = Runtime.getRuntime();
try
{
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;

BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
    if (line.contains("secure")) continue;
    if (line.contains("asec")) continue;

    if (line.contains("fat")) {//external card
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            externalpath = externalpath.concat("*" + columns[1] + "\n");
        }
} 
        else if (line.contains("fuse")) {//internal storage
        String columns[] = line.split(" ");
        if (columns != null && columns.length > 1) {
            internalpath = internalpath.concat(columns[1] + "\n");
        }
    }
}
}
catch(Exception e)
{
    e.printStackTrace();
}
 System.out.println("Path  of sd card external............"+externalpath);
 System.out.println("Path  of internal memory............"+internalpath);
}

代替案:

また、代わりに renderscrip を使用して 3D カルーセルを使用して画像を表示することもできます。

http://code.google.com/p/android-ui-utils/downloads/detail?name=CarouselExample.zip

結果のスナップショット。Jelly Bean でテストされたカルーセル 3D。

ここに画像の説明を入力

于 2013-03-24T09:55:37.027 に答える
1

「アルバムの検索エラー」の問題はbucketId、コードで取得した「DCIM」フォルダーに直接画像が含まれていないことが原因である可能性が最も高いです。たとえば、代わりに「/DCIM/Camera」を使用すると、エラーは発生しません (そこにいくつかの画像があると仮定します)。

ただし、あなたが何を望んでいるのかを正しく理解している場合、このルートに従う場合、起動時に特定のフォルダーを表示するために、Gallery3D コードに追加の変更を加える必要があると思います (コードは設計されていないため)そのように使用されます)。

上記のコードを使用する代わりに、意図を特定のものに設定することで、より簡単に目的を達成できると思いますonCreate()

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

    setIntentToSpecificFolder();

    mApp = new App(Gallery.this);
    // :
    // the rest of onCreate() code
    // :
    Log.i(TAG, "onCreate");
}

private void setIntentToSpecificFolder() {
    String folderPath = Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera";
    int folderBucketId = folderPath.toLowerCase().hashCode();
    Uri targetUri = Media.EXTERNAL_CONTENT_URI.buildUpon().appendQueryParameter("bucketId", String.valueOf(folderBucketId)).build();

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(targetUri, "vnd.android.cursor.dir/image");
    setIntent(intent);
}

基本的に、ここで行っているのは、アプリにMIME タイプACTION_VIEWが提供されている場合のアプリのインテント処理を活用することです。vnd.android.cursor.dir/image

于 2013-03-24T06:51:07.870 に答える