0

ユーザーがクリックして画像をロードする必要がある画像ビューを配置する必要があるアプリを作成しています。クリックした後、ユーザーが携帯電話自体から保存された画像をロードするか、カメラから新しいショットを撮るかを選択するオプションを提供します。

この質問は冗長かもしれませんが、ここで明らかにされた同様の質問/問題のほとんどは、私がやろうとしていることに到達しませんでした.

Ps Eclipse 4.2 (JUNO) SDK がインストールされた Android API15 に取り組んでいます。

エラーが発生するメインアクティビティのスニペットコードは次のとおりです。

 package test.imgbyte.conerter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.net.Uri;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;
import android.view.View;

public class FindImgPathActivity extends Activity 
{

      private Uri mImageCaptureUri;
      static final int CAMERA_PIC_REQUEST = 1337; 

      public void onCreate(Bundle savedInstanceState)
      {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.imgfilepath);

        Button camera = (Button) findViewById(R.id.btnLoad);
        camera.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View v) 
            {
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
                startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);               
            }               
        });

      }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CAMERA_PIC_REQUEST) 
        {  
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
            ImageView image = (ImageView) findViewById(R.id.imgLoaded);  
            image.setImageBitmap(thumbnail);  

            String pathToImage = mImageCaptureUri.getPath();

            // pathToImage is a path you need. 

            // If image file is not in there, 
            //  you can save it yourself manually with this code:
            File file = new File(pathToImage);

            FileOutputStream fOut;
            try 
            {
                fOut = new FileOutputStream(file);
                thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, fOut); // You can choose any format you want
            } 
            catch (FileNotFoundException e) 
            {
                e.printStackTrace();
            }

        }  
    }    
}

LogCat から取得したエラーは次のようなものです。

11-05 19:23:11.777: E/AndroidRuntime(1206): FATAL EXCEPTION: main
11-05 19:23:11.777: E/AndroidRuntime(1206): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1337, result=-1, data=Intent { act=inline-data (has extras) }} to activity {test.imgbyte.conerter/test.imgbyte.conerter.FindImgPathActivity}: java.lang.NullPointerException
4

1 に答える 1

4

ああ。このエラー。私はそれが何を意味するのかを解読するのに何年も費やしましたが、どうやら結果にはアクセスしようとしているnullフィールドが含まれているようです。あなたの場合、ファイルで実際に初期化していないのは mImageCaptureUri フィールドです。カメラ インテントを開始する方法は、ファイルを作成し、その Uri を EXTRA_OUTPUT としてインテントに渡すことです。

File tempFile = new File("blah.jpg");
...
cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
...

その後、file.getAbsolutePath() メソッドを使用してビットマップをロードできます。

この時点で、ビットマップを直接ロードすることについて先週学んだ非常に重要なポイントを共有させてください... しないでください! その理由を理解するのに 1 週​​間かかりました。

このコードを使用して、ビットマップを効率的にロードします。(ファイルを取得したら、BitmapFactory.decodeFile() で file.getAbsolutePath() を使用するだけです):

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float)height / (float)reqHeight);
            } else {
                inSampleSize = Math.round((float)width / (float)reqWidth);
            }
        }
        return inSampleSize;
    }

    public static Bitmap decodeSampledBitmapFromPath(String path, int reqWidth, int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(path, options);
    }

file.getAbsolutePath() を最初の引数として、必要な幅と高さとともに、decodeSampledBitmapFromPath 関数に渡すだけで、効率的にロードされたビットマップを取得できます。このコードは、Android ドキュメントのバージョンから変更されました。

編集:

private Uri mImageCaptureUri; // This needs to be initialized.
      static final int CAMERA_PIC_REQUEST = 1337; 
private String filePath;

      public void onCreate(Bundle savedInstanceState)
      {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.imgfilepath);
// Just a temporary solution, you're supposed to load whichever directory you need here
        File mediaFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Temp1.jpg");
filePath = mediaFile.getABsolutePath();

        Button camera = (Button) findViewById(R.id.btnLoad);
        camera.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View v) 
            {
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile));
                startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);               
            }               
        });

      }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CAMERA_PIC_REQUEST) 
        {  
            if(resultCode == RESULT_OK)
          {
int THUMBNAIL_SIZE = 64;
// Rest assured, if the result is OK, you're file is at that location
            Bitmap thumbnail = decodeSampledBitmapFromPath(filePath, THUMBNAIL_SIZE, THUMBNAIL_SIZE); // This assumes you've included the method I mentioned above for optimization
            ImageView image = (ImageView) findViewById(R.id.imgLoaded);  
            image.setImageBitmap(thumbnail);  
          }
    }    
}
于 2012-11-05T19:09:59.140 に答える