組み込みの CropImageActivity を使用して画像を選択すると、ピッカーは外部アプリ (私の場合は WPS Office) からファイル (任意の種類) を選択するオプションを表示します。したがって、pdf ファイル (たとえば) を選択すると、 onSetImageUriComplete() はエラーを引き起こしません。
@Override
public void onSetImageUriComplete(CropImageView cropImageView, Uri uri, Exception error) {
progressView.setVisibility(View.INVISIBLE);
if (error != null) {
Log.e(LOG_TAG, "Failed to load image for cropping", error);
AndroidUtils.showToast("Unable to upload", this);
finish();
}
}
このような場合、エラーは null ではありません。そのため、UI には何も表示されず、それが画像かどうかを知る方法がありません。
URI から拡張子を確認しようとしましたが、一部のモデル (私の場合は One Plus X) では、uri に必ずしも拡張子が含まれているとは限りません。
また、URIをファイルにロードしてから、次のコードを使用して確認してみました:
public static boolean isImage(File file) {
if (file == null || !file.exists()) {
return false;
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file.getPath(), options);
return options.outWidth != -1 && options.outHeight != -1;
}
ただし、One Plus X の場合は、再び false を返します。フェッチされたファイルが画像であるかどうかを確認する他の方法 (リソースを集中的に使用しない方法) はありますか?