1

私の解決策: いくつかの良い答えがあります。これが私が思いついたものです。自分の質問に答えたり、適切なスタックオーバーフローのためにここに置いたりするかどうかわからないので、知っている人は共有してください。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
        case cameraData:
            Bundle extras = data.getExtras();
            bmp = (Bitmap) extras.get("data");
            iv.setVisibility(View.VISIBLE);
            break;
        case SELECT_PICTURE:
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            File imgFile = new File(selectedImagePath);
            bmp = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
            break;
        }
        iv.setVisibility(View.VISIBLE);
        iv.setImageBitmap(bmp);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 50, stream); // compress
        byte[] ba = stream.toByteArray();
        image_str = Base64.encodeBytes(ba);
    }
}

/////////////////////////////////////////////// //////////////////////////////////////

OK、ギャラリーに画像へのパスがあります。その写真を撮影してバンドルに変換し、64 エンコードしてサーバーにアップロードできるようにしたいと考えています。これが私の onActivityResult です。ギャラリーから取得するのではなく、カメラで写真を撮ることで機能しています。

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK){
            switch(requestCode){
            case cameraData:                
                Bundle extras = data.getExtras();
                bmp = (Bitmap) extras.get("data");
                Log.e("picture","Take Picture");
                break;
            case SELECT_PICTURE:
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
                Log.e("picture",selectedImagePath);
                File imgFile = new  File(selectedImagePath);                    
                bmp = (Bitmap)     BitmapFactory.decodeFile(imgFile.getAbsolutePath());
                Bundle extras1 = ((Cursor) imgFile).getExtras();
    //          bmp = (Bitmap) extras1.get("data");
                Log.e("picture","from Gallery");
                break;
            }
        }
    } 

Base 64 コードは、このサイトの私のものではありません: http://blog.sptechnolab.com/2011/03/09/android/android-upload-image-to-server/

getPath:

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
4

3 に答える 3

0

ビットマップを直接 base64 に変換できます。

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos); 
byte[] bitmapdata = bos.toByteArray();

byte[] dataToUpload = Base64.encode(bitmapdata , DEFAULT);

ビットマップを Bundle に変換するには、 を使用bundle.putParcelable("dataToUpload", bitmap) して回収しbundle.getParcelable("dataToUpload")ます。

于 2012-04-24T14:16:49.727 に答える
0

なぜビットマップをバンドルに変換したいのですか? また、アップロードする前にファイルを base64 文字列に変換する必要があるのはなぜですか?

ファイルをアップロードする例を次に示します

于 2012-04-24T14:13:04.857 に答える
0

http://pastebin.com/3A5gMFsF

あなたが望むことをするようです。ファイル URI を取得する場合、実際にファイル自体を取得するには、いくつかのコンテンツ リゾルバーを掘り下げる必要があるようです。

Uri photoUri = data.getData();
    if (photoUri != null)
    {
    try {
          String[] filePathColumn = {MediaStore.Images.Media.DATA};
          Cursor cursor = getContentResolver().query(photoUri, filePathColumn, null, null, null); 
          cursor.moveToFirst();
          int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
          String filePath = cursor.getString(columnIndex);
          cursor.close();
          bMap_image = BitmapFactory.decodeFile(filePath);
          ImageView img = (ImageView) findViewById(R.id.gallery1);
          img.setImageBitmap(bMap_image);

編集: このバージョンとあなたのバージョンの唯一の違いは、このバージョンが BitMap.Decode を呼び出す前に filePath をファイルに変換しないことです。コンテンツ リゾルバーから返されたファイル パスで BitmapFactory.decodeFile を直接呼び出します。

于 2012-04-24T14:13:07.197 に答える