2016-06-28 9 views
2

Это мое неявное намерение вызвать изображение редактирования приложения на устройстве:андроида неявное намерение изменить не удалось загрузить изображение

startActivity(new Intent(Intent.ACTION_EDIT).setDataAndType(myUri, 
    getMimeType(myUri)).setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | 
    Intent.FLAG_GRANT_WRITE_URI_PERMISSION)); 

И это, как я getMimeType:

public String getMimeType(Uri uri) { 
    String mimeType = null; 
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { 
     ContentResolver cr = getContentResolver(); 
     mimeType = cr.getType(uri); 
    } else { 
     String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri 
       .toString()); 
     mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
       fileExtension.toLowerCase()); 
    } 
    return mimeType; 
} 

Для некоторых приложений это аварийные сигналы для загрузки:

В приложении Sketch_Camera только невидимая страница загружает и отключает взаимодействие с моим приложением.

В приложении AirBrush загружается приложение, но с этим сообщением «Не удалось загрузить изображение».

Связано ли это с минимальной версией sdk, так как у меня 16? Я тестировал это на минимальной версии sdk 9 и не изменял результат.

Есть ли что-нибудь еще, что я должен добавить к этому намерению работать со всеми приложениями?

Я попытался putExtra тоже, и это не помогает:

.putExtra(Intent.ACTION_EDIT, myUri); 

Я некоторые галереи приложений на устройстве, и все они запустить Sketch_Camera и AirBrush без каких-либо проблем.

Что здесь происходит? Я так смущен после двух дней борьбы с этим явлением.

+1

Какова ценность 'myUri'?Почему вы используете 'image/*' вместо фактического MIME-типа (так как это * ваш * контент, поэтому * вы знаете, что такое тип MIME)? – CommonsWare

+0

myUri - это uri из файла изображения >> 'Uri.fromFile (myFile)' и почему я использую 'image/*' вместо фактического MIME-типа? Я выбрал код из стека. Теперь я отредактировал вопрос на основе вашего гида. Но все же я получаю тот же результат. – Eftekhari

+1

«myUri - это uri из файла изображения» - и где этот файл? 'Intent.FLAG_GRANT_READ_URI_PERMISSION' и' Intent.FLAG_GRANT_WRITE_URI_PERMISSION' бесполезны в этом случае, поскольку они не относятся к значениям 'file'' Uri'. – CommonsWare

ответ

2

Это файл, созданный путь один медиа-файл хранилище, запрашивая MediaStore.Images.Media.EXTERNAL_CONTENT_URI

Там нет никакой гарантии, что другие приложения имеют право на это место, или даже что ваше приложение имеет права на это место. Например, изображение может быть на removable storage. Кроме того, the fileUri scheme is being banned for cross-app usage, во всяком случае.

Используйте вместо этого contentUri. Например, в this sample app, я запрашиваю MediaStore для видео. Получив право на Cursor имя row, расположенные на определенное видео, я генерировать Uri для него с помощью:

videoUri= 
    ContentUris.withAppendedId(
     MediaStore.Video.Media.EXTERNAL_CONTENT_URI, row.getInt(row.getColumnIndex(MediaStore.Video.Media._ID))); 

Это Uri обе работы для своих собственных целей (например, рука Пикассо, чтобы получить миниатюру, руку VideoView для воспроизведения) и для передачи сторонним приложениям (например, ACTION_VIEW для воспроизведения).

За исключением замены базы Uri на тот, который вы запрашивали против (MediaStore.Images.Media.EXTERNAL_CONTENT_URI), тот же базовый код должен работать на вас.

Также избавитесь от флагов от Intent. Это только для тех случаев, когда Intent указывает на ваш собственный ContentProvider, что не относится ни к вашему исходному коду, ни к Uri, которые вы создаете с withAppendedId().