1

私のアプリケーションでは、次の方法でカメラインテントを呼び出します。

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);

メソッドを呼び出さないonActivityResult()

私のアプリケーションの問題は、このメソッドを呼び出すときもありますが、写真をキャプチャした後、再び写真キャプチャ画面に表示されることです。

写真を撮る前にたくさんのデータを保存し、onSaveInstanceState()その後でこのデータを収集していますonRestoreInstanceState()

ここでは、なぜ一部のtimeメソッドが呼び出されるのかわかりませんがonActivityResult()、写真キャプチャモードに入った後にこのメソッドが呼び出されない場合があります。

onActivityResult()コード:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
    String fileName = null;
    try {
        if (requestCode == CAMERA_REQUEST) {
            roughBitmap = (Bitmap) data.getExtras().get("data");
            final ContentResolver cr = getContentResolver();
            final String[] p1 = new String[] {
                MediaStore.Images.ImageColumns._ID,
                    MediaStore.Images.ImageColumns.DATE_TAKEN };
            Cursor c1 = cr.query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, p1, null,
                        null, p1[1] + " DESC");
                if (c1.moveToFirst()) {
                    String uristringpic = "content://media/external/images/media/"
                            + c1.getInt(0);
                    newuri = Uri.parse(uristringpic);
                    // Log.i("TAG", "newuri "+newuri);
                    snapName = getRealPathFromURI(newuri);
                    Uri u = Uri.parse(snapName);

                    File f = new File("" + u);
                    fileName = f.getName();
                }
                c1.close();

                  setImageParameter();

            }
        } catch (NullPointerException e) {

        }
        System.out.println("*** End of onActivityResult() ***");
    }

public void setImageParameter() {
    // decode full image
    roughBitmap = BitmapFactory.decodeFile(snapName);
    // calc exact destination size
    Matrix matrix = new Matrix();
    RectF inRect = new RectF(0, 0, roughBitmap.getWidth(),
            roughBitmap.getHeight());
    // RectF outRect = new RectF(0, 0, dstWidth, dstHeight);
    RectF outRect = new RectF(0, 0, 640, 480);
    matrix.setRectToRect(inRect, outRect, Matrix.ScaleToFit.CENTER);
    float[] values = new float[9];
    matrix.getValues(values);
    // resize bitmap
    resizedBitmap = Bitmap.createScaledBitmap(roughBitmap,
            (int) (roughBitmap.getWidth() * values[0]),
            (int) (roughBitmap.getHeight() * values[4]), true);

    paint = new Paint();
    paint.setColor(Color.GREEN);
    paint.setTextSize(16);
    paint.setTextAlign(Paint.Align.LEFT);

    Canvas canvas = new Canvas(resizedBitmap);

    canvas.drawText(String.valueOf(lat), resizedBitmap.getWidth() - 290, resizedBitmap.getHeight() - 50, paint);
    canvas.drawText(String.valueOf(lng), resizedBitmap.getWidth() - 140, resizedBitmap.getHeight() - 50, paint);
    if (!editTextRoadName.getText().toString().equalsIgnoreCase("")) {
        canvas.drawText(editTextRoadName.getText().toString(), resizedBitmap.getWidth() - 290, resizedBitmap.getHeight() - 30, paint);
    }
    canvas.drawText(new DateClass().getSysDateTimeForPhoto(), resizedBitmap.getWidth() - 290, resizedBitmap.getHeight() - 10, paint);



    if (nFinalOrientation == 1) {
        matrix.postRotate(90);
    } else {
        matrix.postRotate(0);
    }


    rotatedBitmap = Bitmap.createScaledBitmap(resizedBitmap,
            (int) (resizedBitmap.getWidth() * values[0]),
            (int) (resizedBitmap.getHeight() * values[4]), true);

    if (booleanPhotoFlag) {
        booleanPhotoFlag = false;
        photoBitmap = rotatedBitmap.copy(Bitmap.Config.ARGB_8888, true);
        imageViewPhoto.setImageBitmap(photoBitmap);

    } else {
        landmarkBitmap = rotatedBitmap.copy(rotatedBitmap.getConfig(), rotatedBitmap.isMutable() ? true : false);
        imageViewLocationPhoto.setImageBitmap(landmarkBitmap);
    }

}
4

5 に答える 5

3

これを使って写真を撮ることができるカメラライブラリプロジェクトを作成しました。このライブラリを使用して写真を撮ることをお勧めします

編集2:

protected void onActivityResult(int requestCode, int resultCode, Intent data)との間にログを配置しsuper.onActivityResult(requestCode, resultCode, data);て、そのメソッドが呼び出されているかどうかを確認してください。呼び出されている場合は、返される値を確認してください。AND onActivityResultはアクティビティによって呼び出されませんが、この場合は呼び出しintent元のアクティビティによってMediaStore.ACTION_IMAGE_CAPTURE呼び出されるため、onActivityResultはsetResult()呼び出し元のアクティビティのによって呼び出される必要があります。しかし、私はあなたがここのような意図を介してビットマップを渡そうとしないことを望みます

于 2012-11-09T08:29:13.237 に答える
1

AndroidManifest.xmlで権限が設定されているかどうかを確認します

<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

WRITE_EXTERNAL_STORAGEは、最初にイメージファイルをディスクに保存する必要がある大きなビッグマップを取得するためのものです。

于 2013-08-21T03:22:45.693 に答える
1

android:launchMode="singleInstance"私はmanifest.xmlのアクティビティで使用していました。それを削除すると、再び動作し始めました。それが役に立てば幸い。

于 2015-02-24T19:58:22.327 に答える
0

このようなインテントを作成することでこれを達成できます

Intent cameraIntent = new Intent(
                        android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, 0);

onActivityResultこのような

public void onActivityResult(int intRequestCode, int intResultCode,
            Intent objresult) {
        if (intResultCode == RESULT_OK) {
        if (intRequestCode == 0) {
            try {
                Bitmap photo = (Bitmap) objresult.getExtras().get("data");
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] byteArray = stream.toByteArray();
                strAttachmentCoded = new String(byteArray);
                } catch (Exception e) {
                Toast.makeText(context, "Picture not stored. Please try again",
                        Toast.LENGTH_LONG).show();
            }
        }
    }

:)

于 2012-11-09T08:47:49.867 に答える
0
I faced same problem , once check have you put any tag related to History ?
Do not put android:noHistory="true" tag in manifest 
if you use android:noHistory="true" in your activity inside manifest , it will
remove from stack after on stop .

注:タブアクティビティを使用している場合は、android:noHistory = "true"を使用しないでください。そうでない場合は、マニフェスト内のアクティビティにandroid:noHistory="false"を入力してください。

于 2013-07-03T10:52:02.203 に答える