Подтвердить что ты не робот

Загрузить изображение Picasa для загрузки из галереи

Я работаю над задачами и связанными с ними задачами, которые позволяют пользователям выбирать изображение для использования в качестве изображения профиля из Галереи. После того, как выбор сделан, изображение загружается на веб-сервер через его 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-адрес для изображения, если он не является локальным хранилищем, но я не могу найти никакой информации об этом в любом месте.

4b9b3361

Ответ 1

Я столкнулся с той же проблемой,
Наконец, решение, которое я нашел, состояло в том, чтобы запустить 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
                                    }
}

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

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

Ответ 2

Почему вы используете метод 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;
}