0

テキストと画像を保存できるシンプルなアプリを作成することを考えていました。最初と 2 番目の演習のメモ帳チュートリアル ( http://developer.android.com/training/notepad/index.html ) から始めました。画像を処理するために 2 番目の演習を行った後、ユーザーがデバイスの戻るボタンをタップしない限り、非常にうまく機能していました。助けを借りて、ライフサイクルイベントを処理することを目標とするこの演習が行われました。データベース内の古いエントリに対しては非常にうまく機能していますが、新しい画像を追加しようとすると、ImageView が撮影したばかりの写真でいっぱいになりません。どこに問題があるのか​​ わかりますか?

public class ParagonArmageddonEdit extends Activity
{

private EditText mTitleText;
private EditText mBodyText;
private Long mRowId;
private ImageView imageContainer;
private byte[] imageInByteArray;
private Button takePhotoButton;
private ParagonDbAdapter mDbHelper;

private static final long serialVersionUID = 1L;
public boolean classEnabled;
private static final int CAMERA_REQUEST = 1888;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    mDbHelper = new ParagonDbAdapter(this);
    mDbHelper.open();

    setContentView(R.layout.paragonarmageddon_edit);
    setTitle(R.string.edit_note);

    this.imageContainer = (ImageView) this.findViewById(R.id.ImageView);
    this.takePhotoButton = (Button) this.findViewById(R.id.photoButton);
    mTitleText = (EditText) findViewById(R.id.title);
    mBodyText = (EditText) findViewById(R.id.body);

    Button confirmButton = (Button) findViewById(R.id.Save);

    mRowId = (savedInstanceState == null) ? null :
        (Long) savedInstanceState.getSerializable(ParagonDbAdapter.KEY_ROWID);
    if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        mRowId = extras != null ? extras.getLong(ParagonDbAdapter.KEY_ROWID)
                                : null;
    }
    populateFields();

    this.takePhotoButton.setOnClickListener(new View.OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            //camera Intent
            Intent IntentKamery = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(IntentKamery, CAMERA_REQUEST); 
        }
    });

    confirmButton.setOnClickListener(new View.OnClickListener()
    {

        public void onClick(View view) {
            setResult(RESULT_OK);
            finish();
        }

    });
}

private void populateFields() {
    if (mRowId != null) {
        Cursor note = mDbHelper.fetchNote(mRowId);
        startManagingCursor(note);
        mTitleText.setText(note.getString(
                note.getColumnIndexOrThrow(ParagonDbAdapter.KEY_TITLE)));
        mBodyText.setText(note.getString(
                note.getColumnIndexOrThrow(ParagonDbAdapter.KEY_BODY)));
        byte[] photo = note.getBlob(note.getColumnIndexOrThrow(ParagonDbAdapter.KEY_ZDJECIE));
        Bitmap photoConvertedToBitmap = BitmapFactory.decodeByteArray(zdjecie, 0, photo.length);
        this.imageContainer.setImageBitmap(photoConvertedToBitmap);
    }
}

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{  
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK)
    {   
        Bitmap photoConvertedToBitmap = (Bitmap) data.getExtras().get("data"); 
        imageContainer.setImageBitmap(photoConvertedToBitmap);

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        photoConvertedToBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        imageInByteArray = stream.toByteArray();
        photoTaken = true;
    }  
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    saveState();
    outState.putSerializable(ParagonDbAdapter.KEY_ROWID, mRowId);
}

@Override
protected void onPause() {
    super.onPause();
    saveState();
}

@Override
protected void onResume() {
    super.onResume();
    populateFields();
}

private void saveState() {
    String title = mTitleText.getText().toString();
    String body = mBodyText.getText().toString();

    imageContainer.buildDrawingCache();
    Bitmap photoConvertedToBitmap = imageContainer.getDrawingCache();

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    photoConvertedToBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    imageInByteArray = stream.toByteArray();

    if (mRowId == null) {
        long id = mDbHelper.createNote(title, body, imageInByteArray);
        if (id > 0) {
            mRowId = id;
        }
    } else {
        mDbHelper.updateNote(mRowId, title, body, imageInByteArray);
    }
}
}
4

1 に答える 1

0

インテントandroid.provider.MediaStore.ACTION_IMAGE_CAPTUREは、その「データ」エクストラでバイト配列を返しません。Uri開く必要がある画像にa を返します。

Uri uri = data.getData();

これにより、次を使用してロードできる画像へのコンテンツ パスが提供されますContentResolver

InputStream input = context.getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(input);

が存在することを確認し、Uriエラーを適切に処理する必要があります。別のアプリが適切なことを行うと想定してはならず、可能な限り不正な形式のデータや欠落しているデータを想定する必要があります。

于 2013-02-19T20:20:49.363 に答える