Галерея Android "поделиться через" и Intent.EXTRA_STREAM - PullRequest
1 голос
/ 28 июля 2011

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

Я предпринял честную попытку интегрировать обработку намерений с прикрепленными EXTRA_STREAM, например, сгенерированными кнопкой "поделиться" в галерее.

Это работает на моем Droid X и работает на эмуляторе.

Сегодня я получил сообщение об ошибке от пользователя; курсор, который я использовал, чтобы вытащить фотографию из MediaStore, вернул null, когда я попросил его вернуть мне ресурс, указанный в параметре EXTRA_STREAM. Код уже прошел через тот момент, когда он проверил, что к Intent был прикреплен EXTRA_STREAM, и пользователь сказал мне, что они используют опцию «поделиться» из галереи.

Их устройство было:

Версия ОС: 2.3.3 (10 / GRI40) Устройство: HTC PG86100

Что дает?

Почему галерея HTC отправляет мне Намерение с EXTRA_STREAM, к которому я не могу получить доступ?

Существуют ли другие причины, по которым курсор возвращает ноль?

String[] filePathColumn = {MediaColumns.DATA};

Uri selectedImageUri;

//Selected image returned from another activity
if(fromData){
    selectedImageUri = imageReturnedIntent.getData();
} else {
    //Selected image returned from SEND intent

    // This is the case that I'm having a problem with.
    // fromData is set in the code that calls this; 
    // false if we've been called from an Intent that has an
    // EXTRA_STREAM
    selectedImageUri = (Uri)getIntent().getExtras().get(Intent.EXTRA_STREAM);
}

Cursor cursor = getContentResolver().query(selectedImageUri, filePathColumn, null, null, null);
cursor.moveToFirst();  // <-- NPE on this line

1 Ответ

3 голосов
/ 23 августа 2011

Оказывается, многие приложения будут отправлять EXTRA_STREAM с типом изображения / * mime, но не все из них используют контент-провайдера галереи.

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

код, который работает следующим образом:

String filePath;
String scheme = selectedImageUri.getScheme(); 

if(scheme.equals("content")){
    Cursor cursor = getContentResolver().query(selectedImageUri, filePathColumn, null, null, null);
    cursor.moveToFirst(); // <--no more NPE

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);

    filePath = cursor.getString(columnIndex);

    cursor.close();

} else if(scheme.equals("file")){
    filePath = selectedImageUri.getPath();
    Log.d(App.TAG,"Loading file " + filePath);
} else {
    Log.d(App.TAG,"Failed to load URI " + selectedImageUri.toString());
    return false;
}
...