Получить изображение Picasa для загрузки из галереи - PullRequest
13 голосов
/ 10 мая 2011

Я работаю над действием и связанными задачами, которые позволяют пользователям выбирать изображение для использования в качестве своего профиля изображения из Галереи.После выбора изображение загружается на веб-сервер через его API.У меня с этим работают обычные изображения из галереи.Однако, если выбрано изображение из Веб-альбома Picasa , ничего не возвращается.

Я сделал много отладок и сузил проблему до этого метода.

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    //cursor is null for picasa images
    if(cursor!=null)
    {
        int column_index = cursor
        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    else return null;
}

Изображения Picasa возвращают нулевой курсор. MediaStore.Images.Media.DATA для них, однако, не ноль.Он возвращает только #id, поэтому я предполагаю, что по адресу нет реальных растровых данных.Изображения Picasa хранятся локально на устройстве?

Я также заметил из документации, что MediaStore.Images.ImageColumns.PICASA_ID существует.Это значение существует для выбранных изображений Picasa, но не для других изображений галереи.Я думал, что мог бы использовать это значение, чтобы получить URL для изображения, если оно не хранится локально, но я нигде не могу найти информацию о нем.

Ответы [ 2 ]

5 голосов
/ 12 мая 2011

Я столкнулся с точно такой же проблемой,
Наконец, решение, которое я нашел, состояло в том, чтобы запустить намерение ACTION_GET_CONTENT вместо ACTION_PICK, а затем убедиться, что вы предоставили дополнительный MediaStore.EXTRA_OUTPUT с URI во временный файл. Вот код для начала намерения:

public class YourActivity extends Activity {
    File mTempFile;
    int REQUEST_CODE_CHOOSE_PICTURE = 1;

    (...)
    public showImagePicker() { 
        mTempFile = getFileStreamPath("yourTempFile");
        mTempFile.getParentFile().mkdirs();
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
        intent.setType("image/*");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile));
        intent.putExtra("outputFormat",Bitmap.CompressFormat.PNG.name());                       
        startActivityForResult(intent,REQUEST_CODE_CHOOSE_PICTURE);
    }

    (...)
}

Возможно, вам потребуется mTempFile.createFile ()

Тогда в onActivityResult вы сможете получить изображение таким образом

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    case REQUEST_CODE_CHOOSE_PICTURE:
                Uri imageUri = data.getData();
                if (imageUri == null || imageUri.toString().length() == 0) {
                    imageUri = Uri.fromFile(mTempFile);
                    file = mTempFile;
                }
                                    if (file == null) {
                                       //use your current method here, for compatibility as some other picture chooser might not handle extra_output
                                    }
}

Надеюсь, это поможет

Затем вы должны удалить свой временный файл по окончании (он находится во внутреннем хранилище как есть, но вы можете использовать внешнее хранилище, я думаю, это будет лучше).

1 голос
/ 11 октября 2012

Почему вы используете метод managedQuery()?Этот метод устарел.

Если вы хотите преобразовать Uri в Bitmap объект, попробуйте этот код:

public Bitmap getBitmap(Uri uri) {

    Bitmap orgImage = null;
    try {
        orgImage = BitmapFactory.decodeStream(getApplicationContext().getContentResolver().openInputStream(uri));
    } catch (FileNotFoundException e) {
        // do something if you want
    }
    return orgImage;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...