0

Androidで写真を作成してMotorola Gに保存すると、ギャラリーに問題なく表示されるため、これは私を夢中にさせています。しかし、Samsung Galaxy S3 でコードを実行すると、ファイルの種類が不明な「カメラ」というフォルダーのみが表示されます。

私のプリティ スパゲッティ コードでわかるように、次のファイルを作成します。

 //Insert an image and create a thumbnail for it.
 // 
 // @param cr
 //            The content resolver to use
 // @param source
 //            The stream to use for the image
 // @param title
 //            The name of the image
 // @param description
 //            The description of the image
 // @return The URL to the newly created image, or <code>null</code> if 
 //        the image failed to be stored for any reason.
 //
public final String insertImage(ContentResolver cr, Bitmap source,
        String title, String description, Long time) {
    ContentValues values = new ContentValues();
    values.put(Images.Media.TITLE, title);
    values.put(Images.Media.DESCRIPTION, description);
    values.put(Images.Media.MIME_TYPE, "image/jpeg");
    values.put(Images.Media.DATE_TAKEN, time);

    String stringUrl = null; /* value to be returned */

    OutputStream imageOut = null;
    try {
        valPub.url = cr.insert(Media.EXTERNAL_CONTENT_URI, values);
        try {
            imageOut = cr.openOutputStream(valPub.url);
            valPub.strUltimaFoto = valPub.url.getPath() + "/" + title;
        } catch (Exception e) {
            // Esto resuelve el problema de las cámaras Samsung
            stringUrl = valPub.pathSamsung; 
            File mDir = new File(stringUrl);
            if (!mDir.exists()) {
                mDir.mkdirs();
            }
            stringUrl = stringUrl + title;
            valPub.strUltimaFoto = stringUrl;
            File m_fil = new File(stringUrl);
            valPub.url = Uri.fromFile(m_fil);
            imageOut = new FileOutputStream(m_fil);
        }
        try {
            source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
            // bmpFoto = Bitmap.createBitmap(source);

        } catch (Exception e) {
        } finally {
            imageOut.close();
        }

        long id=0;
        try {
            id = ContentUris.parseId(valPub.url);
        }catch(Exception nEx) {
            Cursor mCursorLoader;
            int mColumnIndex;
             // Initializing CursorLoader
            mCursorLoader = initializeCursorLoader();
            mColumnIndex = mCursorLoader.getColumnIndex(MediaStore.Images.Media._ID);

            // Go thru all the images in the device (EXTERNAL_CONTENT_URI)
            for (int i = 0; i < mCursorLoader.getCount(); i++) {
                mCursorLoader.moveToPosition(i);
                id = mCursorLoader.getInt(mColumnIndex);
            }

        }

        // Wait until MINI_KIND thumbnail is generated.
        Bitmap miniThumb = null;
        try {
            miniThumb = Images.Thumbnails.getThumbnail(cr, id,
                    Images.Thumbnails.MINI_KIND, null);
        } catch (Exception e) {

        }
        if (miniThumb == null) {
            // Trick samsung
            galleryAddPic(valPub.url);
        }
        // This is for backward compatibility.
        @SuppressWarnings("unused")
        Bitmap microThumb = null;
        try {
            microThumb = StoreThumbnail(cr, miniThumb, id, 50F, 50F,
                    Images.Thumbnails.MICRO_KIND, title);
        } catch (Exception e) {
        }
    } catch (Exception e) {}

    if (valPub.url != null) {
        stringUrl = valPub.url.toString();
    }

    return stringUrl;
}

これでギャラリーを更新しようとしました:

public void galleryAddPic(Uri picUri) {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, picUri);
        sendBroadcast(mediaScanIntent);
    }

...しかし、うまくいきませんでした。非同期タスクに関連するもののようですが、修正方法がわかりません。

残りのコード:

private Cursor initializeCursorLoader() {
        String[] COLUMNS = {
            MediaStore.Images.Thumbnails._ID, MediaStore.Images.Media.DATA
    };

    CursorLoader cursorLoader = new CursorLoader(
    this, // Context
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // Uri
    COLUMNS, // Projection
    null, // Selection
    null, // Selection Args

    // Sort Order: DESC = newest first
    // Sort Order: ASC = oldest first

    MediaStore.Images.Media.DATE_ADDED + " DESC");

    // *** NOTE ***
    // With:
    //
    // MediaStore.Images.Media.DATE_ADDED + " ASC"
    //
    // It runs just fine (MediaStore returns 'null' for invalid thumbnails)
    // The problem seems to reside on the " DESC" tag.
    //
    // How bizarre is that?

    return cursorLoader.loadInBackground();
}




// public static Uri getContentUri(String volumeName) {
// return Uri.parse("content://mtp/" + volumeName + "/video/media");
// }

private final Bitmap StoreThumbnail(ContentResolver cr, Bitmap source,
        long id, float width, float height, int kind, String title) {
    // create the matrix to scale it
    Matrix matrix = new Matrix();

    float scaleX = width / source.getWidth();
    float scaleY = height / source.getHeight();

    matrix.setScale(scaleX, scaleY);

    Bitmap thumb = Bitmap.createBitmap(source, 0, 0, source.getWidth(),
            source.getHeight(), matrix, true);

    ContentValues values = new ContentValues(4);
    values.put(Images.Thumbnails.KIND, kind);
    values.put(Images.Thumbnails.IMAGE_ID, (int) id);
    values.put(Images.Thumbnails.HEIGHT, thumb.getHeight());
    values.put(Images.Thumbnails.WIDTH, thumb.getWidth());

    valPub.url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values);
    if (valPub.url == null) {
        valPub.url = cr.insert(Media.INTERNAL_CONTENT_URI, values);
    }
    OutputStream thumbOut = null;
    try {
        thumbOut = cr.openOutputStream(valPub.url);
    } catch (Exception e) {
    }
    try {
        thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut);
        thumbOut.close();
        return thumb;
    } catch (FileNotFoundException ex) {
        return null;
    } catch (IOException ex) {
        return null;
    }
}

前に言ったように、これはひどいスパゲッティ コードです。最初に実行可能にしようとしていますが、運が悪くても何度も変更しました。改善点がございましたら、お気軽にお申し付けください。

4

1 に答える 1

0

最後に、私はそれを解決しました。Samsung デバイスのギャラリーを更新するため、常に galleryAdPic を実行するようにコードを変更しました。

public void galleryAddPic(Uri picUri) {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, picUri);
    sendBroadcast(mediaScanIntent);
}
于 2016-01-22T11:10:07.970 に答える