1

/sdcard/DCIM/Wallpaper/ のパスにあるフォルダーにコピーした画像ファイルの読み取りに問題があります。

問題は、これらの画像をランダムに読み取ることにあります。

この方法を使用していますが、カーソルが渡した URI を読み取っていないようです。何が起こったのですか?

public static Uri getRandomImage(ContentResolver resolver) {

    String[] projection = new String[] {
        BaseColumns._ID
    };


    String folder = "/sdcard/DCIM/Wallpaper/";
    folder = folder + "%";
    String where = Media.DATA + " LIKE ?";
    String[] whereArgs = new String[]{folder};

    Cursor cursor = resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        projection, where, whereArgs, MediaColumns._ID);


    if (cursor == null || cursor.getCount() <= 0) {
            return null;
    }

    cursor.moveToPosition(new Random().nextInt(cursor.getCount()));

    return Uri.withAppendedPath(uri, cursor.getString(0));
}

ログキャット:

E/it.bisemanuDEV.slidepuzzle.TileView(4458): java.io.FileNotFoundException: No content provider: 
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:464)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:380)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at it.bisemanuDEV.slidepuzzle.TileView.getImageFromUri(TileView.java:562)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at it.bisemanuDEV.slidepuzzle.TileView.onDraw(TileView.java:241)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.View.draw(View.java:6741)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.View.draw(View.java:6744)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.View.draw(View.java:6744)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.View.draw(View.java:6744)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewRoot.draw(ViewRoot.java:1407)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.os.Looper.loop(Looper.java:123)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at java.lang.reflect.Method.invokeNative(Native Method)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at java.lang.reflect.Method.invoke(Method.java:521)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/it.bisemanuDEV.slidepuzzle.TileView(4458):    at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

MediaUriに存在しないディレクトリのUriを取得しようとしています。したがって、FilenotfoundExceptionが発生します。

ディレクトリに存在する画像のみを取得するには、カスタムクエリを作成する必要があります

編集:試したことはありませんが、試してみてください。where句はLIKEを使用する必要があります。これが機能しない場合は、LIKE句を作成するために周りを見回さなければならない場合があります。

String folder = "/sdcard/DCIM/Wallpaper/";
folder = folder + "%";
String where = Media.DATA + " LIKE ?";
String[] whereArgs = new String[]{folder};

cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    projection, where, whereArgs, MediaColumns._ID);

Edit2:

あなたはgetContentResolvernullとして戻っています。getContentResolverコンテキストのメソッドです。使用するcontext.getContentResolver

于 2012-09-08T09:40:02.360 に答える