6

私のアプリケーションにはカメラから画像をキャプチャするオプションがありますが、カメラから画像を取得するには問題があります。これを使用するACTION_IMAGE_CAPTUREとnullデータが返されます。カメラの意図から画像パスを取得するのを手伝ってください

エラーログ:

07-04 11:22:36.902: E/AndroidRuntime(8329): FATAL EXCEPTION: main
07-04 11:22:36.902: E/AndroidRuntime(8329): java.lang.RuntimeException: Unable to resume activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=null} to activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2124)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2139)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1672)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2836)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.access$1600(ActivityThread.java:117)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.os.Looper.loop(Looper.java:130)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.main(ActivityThread.java:3687)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at java.lang.reflect.Method.invokeNative(Native Method)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at java.lang.reflect.Method.invoke(Method.java:507)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at dalvik.system.NativeStart.main(Native Method)
07-04 11:22:36.902: E/AndroidRuntime(8329): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=null} to activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2111)
07-04 11:22:36.902: E/AndroidRuntime(8329):     ... 13 more
07-04 11:22:36.902: E/AndroidRuntime(8329): Caused by: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329):     at com.pausefablogin.AddPOI.onActivityResult(AddPOI.java:281)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.Activity.dispatchActivityResult(Activity.java:3908)
07-04 11:22:36.902: E/AndroidRuntime(8329):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
07-04 11:22:36.902: E/AndroidRuntime(8329):     ... 14 more

前もって感謝します

4

7 に答える 7

10

これを試してください

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

これを呼び出します

@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent resultData) {
    super.onActivityResult(requestCode, resultCode, resultData);

        if (resultData != null) {

        String[] projection = { MediaStore.Images.Media.DATA };
                Cursor cursor = managedQuery(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        projection, null, null, null);
                int column_index_data = cursor
                        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToLast();

                String imagePath = cursor.getString(column_index_data);
                Bitmap bitmapImage = BitmapFactory.decodeFile(imagePath );
                imageView.setImageBitmap(bitmapImage );

            }

そして、あなたが望むものを使用します

 <uses-permission android:name="android.permission.CAMERA" /> 
    <permission android:name="android.permission.FLASHLIGHT" />
    <uses-feature android:name="android.hardware.camera"/>
于 2013-07-04T05:39:26.540 に答える
5

私は同じ問題を抱えていましたが、次のことがうまくいきました:

@Override
public void onClick(View v) {
        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
                }
        });
    }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
        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);
         Uri uri = Uri.parse(uristringpic);
            try {
              Bitmap bm = android.provider.MediaStore.Images.Media.getBitmap(cr, uri);

私はそれがどれほどイライラするかを知っているので、これが役立つことを願っています.

于 2013-07-05T22:55:07.970 に答える
4

コードを正常に実装すると、キャプチャされた画像が取得され、後で使用するために手動で保存できます。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {  
            Bitmap photo = (Bitmap) data.getExtras().get("data"); 
            videoView.setVisibility(View.INVISIBLE);
            imageView.setVisibility(View.VISIBLE);
            imageView.setImageBitmap(photo);
        }
    } 
于 2013-07-04T05:39:20.863 に答える
2

おそらく、Samsung デバイスを実行しています。これは、これらのデバイスで発生するバグだと思います。それ以外の場合は、URI を取得する必要があります。これを行う:

/**
  * (This is a variable instance) Contains the path and file name where you want to save the image.
  * Mainly used to start Intent.Action_View with this URI. (GalleryApp)
  */
private Uri uriImage= null;

public void onClickCamera(View v){
    // Cria uma intent para capturar uma imagem e retorna o controle para quem o chamou (NAO PRECISA DECLARAR PERMISSAO NO MANIFESTO PARA ACESSAR A CAMERA POIS O FAZEMOS VIA INTENT).
    // Creates an intent to capture an image and returns control to the caller
    Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE );
    // Cria um arquivo para salvar a imagem.
    // Creates an file to save the image.
    uriImage = ProcessaImagens.getOutputMediaFileUri( ProcessaImagens.MEDIA_TYPE_IMAGE, getActivity().getApplicationContext() );
    // Intent to pass a URI object containing the path and file name where you want to save the image. We'll get through the data parameter of the method onActivityResult().
    intent.putExtra( MediaStore.EXTRA_OUTPUT, uriImagem );
    // Starts the intent to image capture and waits the result.
    startActivityForResult( intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE );
}

ProcessaImagensクラスは、私がコーディングしたクラスであり、皆さんと共有していますこのクラスを使用して容易にすることができます。データベースに画像を保存する場合、画像を圧縮するための非常に優れた方法があります。そのonActivityResult()方法でこれを行います:

@Override
public void onActivityResult( int requestCode, int resultCode, Intent data ) {
    // If finished activity on startForActivityResult.
    if ( resultCode == Activity.RESULT_OK ) {
        if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE ) {
            String imagePath = uriImage.getPath();
            // I will compress the imagem. Read the javadoc from method and you'll see which it returns both bitmap and array bytes.
            List<Object> imageCompact = ProcessaImagens.compactarImagem( uriImagem.getPath() );
            Bitmap imageBitmap = (Bitmap) imageCompact.get( 0 );
            byte[] imageBytes = (byte[]) imageCompact.get( 1 );

        }
    }
    // If canceled activity on startForActivityResult.
    else if ( resultCode == Activity.RESULT_CANCELED ) {
        if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE ) {
            // User canceled the image capture.
            Log.d( getTag(), "Image capture canceled!" );
        }
    }
    // If an error occurred in the activity on startForActivityResult.
    else {
        // Failed the image capture, alert the user.
        Toast.makeText( getActivity().getApplicationContext(), "FAILED! The image capture failed!", Toast.LENGTH_LONG ).show();
        Log.e( getTag(), "FAILED! The image capture failed!" );
    }
}

getActivity().getApplicationContext()アクティビティからではなくフラグメントからコンテキストを取得しているため、使用したことに注意してください。この方法で、あなたが望むものを手に入れることができると私は信じています。コンテキストを取得する方法を少し変更するだけです。

于 2014-05-09T14:40:04.270 に答える
1
 Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, new String[]{Media.DATA, Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, Media.DATE_ADDED, null, "date_added ASC");
         if(cursor != null && cursor.moveToFirst())
         {
             do {
                 Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(Media.DATA)));
                 String photoPath = uri.toString();
             }while(cursor.moveToNext());


             cursor.close();
         }

whileループが最後の反復を実行すると、前回キャプチャされた画像パスが提供されます。

于 2013-07-04T06:26:52.003 に答える