このアクティビティでは、ユーザーがギャラリーから 1 つの画像を選択するか、写真を撮って (他のデータと共に) Web サイトにアップロードすることができます。
これまでのところ、2 つの異なる問題に遭遇しました。
1)ギャラリーの画像で試してみると、メッセージ /external/images/media/2305: open failed: ENOENT (No such file or directory) で IOException が発生します。これは、ファイル ストリームを開くときに発生します。
2)写真を撮ってみるとOKなのですが、暗号化されたデータ列が「AAAAAAAAAAAAAAAAAAAAAAAAAAA」(本当に長いですが、Aだけ)で構成されており、これは良くない兆候だと思います。ウェブサイトにまだ適切にアップロードできないため、これは推測にすぎませんが、同じデータ文字列を示す別の写真が変なにおいがするだけです。
コードはこちら
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case TAKE_PICTURE:
if (resultCode == Activity.RESULT_OK) {
//Uri selectedImage = imageUri;
loadImage(imageUri);
}
break;
case SELECT_PHOTO:
if(resultCode == Activity.RESULT_OK){
imageUri = data.getData();
loadImage(imageUri);
}
}
}
これは、画像(撮影した写真またはギャラリーから)をImageViewにロードする方法です。それは正常に動作します。
public void loadImage(Uri selectedImage){
mActivity.getContentResolver().notifyChange(selectedImage, null);
ContentResolver cr = mActivity.getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media
.getBitmap(cr, selectedImage);
ivPicture.setImageBitmap(bitmap);
ivPicture.setVisibility(View.VISIBLE);
mActivity.croutonInfo(selectedImage.toString());
} catch (Exception e) {
mActivity.croutonAlert("Failed to load");
e("Camera " + e.toString());
}
}
これは、データのアップロードをモックするために使用する方法です。API を取得すると、http 転送を処理する asynctask が作成されます。これまでのところ、データは論理のない転送オブジェクトに入れられるだけです。
public void uploadTapa() throws IOException{
mActivity.croutonInfo("subiendo tapa ");
d("uploadTapa new ");
TapaUploadParametros tup = new TapaUploadParametros();
d("uploadTapa bar: " + nombreBar);
tup.setBarNombre(etBarName.getText().toString());
d("uploadTapa tapa: " + nombreTapa);
tup.setNombre(etTapaName.getText().toString());
d("uploadTapa municipio: " + municipio);
tup.setLocalidad(municipio);
d("uploadTapa provincia: " + provincia);
tup.setProvincia(provincia);
d("uploadTapa tipologiaId: " + tipologiaId);
tup.setTipo(tipologiaId);
d("uploadTapa precioId: " + precioId);
tup.setPrecio(precioId);
String encodedImage = encodeImgForHTTP(imageUri);
d("uploadTapa encoded image: " + encodedImage);
tup.setPic(encodedImage);
d("uploadTapa direccionBar: " + direccionBar);
tup.setBarDireccion(direccionBar);
}
そして、これが http 転送用に画像をエンコードする方法です。「ストリームを開く前」の直後にギャラリーからの画像が失敗する
private String encodeImgForHTTP (Uri imageUri) throws IOException{
ContentResolver cr = mActivity.getContentResolver();
d("encodeImgForHTTP before opening stream ");
FileInputStream fis = new FileInputStream(imageUri.getPath());
d("encodeImgForHTTP after opening stream ");
// Get binary bytes for encode
byte[] imageBytes = new byte[fis.available()];
d("encodeImgForHTTP after getting byte array ");
// base 64 encode for text transmission (HTTP)
d("encodeImgForHTTP pre 64: " + imageBytes);
String data_string = Base64.encodeToString(imageBytes, Base64.URL_SAFE);
d("encodeImgForHTTP before returning the encoded data string " + data_string);
return data_string;
}
ギャラリーの画像で何が間違っていますか? 異なる画像のエンコーディングが同じに見えるのはなぜですか?