私は私の問題を解決するのに本当に欲求不満です、カメラを使用して、カメラが写真をキャプチャすると、アクティビティで表示され、cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
写真を使用していないときにアクティビティで表示されますが、名前とパスファイルは、私が望んでいたものとは異なります。私はそれをコンパイルするためにgalaxyタブを使用しています、 here 、 here および here から私の問題を解決するためのチュートリアルに従っていますが、私のアプリケーションはまだ強制します閉じるとエラー、これは私のコードです:
{
File sdCard= Environment.getExternalStorageDirectory();
File path = new File (sdCard.getAbsolutePath() + "/Android/data/spaj_foto");
path.mkdir();
File file= new File (path,"spaj_foto.png");
String filePath ="/Android/data/spaj_foto/spaj_foto.png";
try {
file.createNewFile();
} catch (IOException e) {}
mPhotoUri = Uri.fromFile(file);
values.put( MediaStore.Images.ImageColumns.DATA, file.getPath());
mPhotoUri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
startActivityForResult(cameraIntent,TAKE_PHOTO_CODE );
}
activityresultメソッド:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
image_spaj.setImageBitmap(photo);
// CALL THIS METHOD TO GET THE URI FROM THE BITMAP
Uri tempUri = getImageUri(getApplicationContext(), photo);
// CALL THIS METHOD TO GET THE ACTUAL PATH
File finalFile = new File(getRealPathFromURI(tempUri));
// System.out.println(mImageCaptureUri);
}
}
public String getRealPathFromURI(Uri mPhotoUri) {
Cursor cursor = getContentResolver().query(mPhotoUri, null, null, null, null);
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
これは私のlogcatの言うことです:
09-27 10:59:43.186: E/AndroidRuntime(31318): Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {org.example.touch/org.example.touch.FormSpaj}: Java.lang.NullPointerException
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3179)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:3222)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.app.ActivityThread.access$1100(ActivityThread.Java:140)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1276)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.os.Handler.dispatchMessage(Handler.Java:99)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.os.Looper.loop(Looper.Java:137)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.app.ActivityThread.main(ActivityThread.Java:4895)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Java.lang.reflect.Method.invokeNative(Native Method)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Java.lang.reflect.Method.invoke(Method.Java:511)
09-27 10:59:43.186: E/AndroidRuntime(31318): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:994)
09-27 10:59:43.186: E/AndroidRuntime(31318): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:761)
09-27 10:59:43.186: E/AndroidRuntime(31318): at dalvik.system.NativeStart.main(Native Method)
09-27 10:59:43.186: E/AndroidRuntime(31318): Caused by: Java.lang.NullPointerException
09-27 10:59:43.186: E/AndroidRuntime(31318): at org.example.touch.FormSpaj.onActivityResult(FormSpaj.Java:993)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.app.Activity.dispatchActivityResult(Activity.Java:5347)
09-27 10:59:43.186: E/AndroidRuntime(31318): at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3175)
09-27 10:59:43.186: E/AndroidRuntime(31318): ... 11 more
誰かが私の問題を解決するのを手伝ってくれることを本当に望んでいます。
カメラの許可と外部ストレージの読み取り/書き込みの両方の許可を持っていることを確認してください。
これが私と一緒に魅力のように動作していることを試してください
private String selectedImagePath = "";
final private int PICK_IMAGE = 1;
final private int CAPTURE_IMAGE = 2;
public Uri setImageUri() {
// Store image in dcim
File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".png");
Uri imgUri = Uri.fromFile(file);
this.imgPath = file.getAbsolutePath();
return imgUri;
}
public String getImagePath() {
return imgPath;
}
btnGallery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE);
}
});
btnCapture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri());
startActivityForResult(intent, CAPTURE_IMAGE);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_CANCELED) {
if (requestCode == PICK_IMAGE) {
selectedImagePath = getAbsolutePath(data.getData());
imgUser.setImageBitmap(decodeFile(selectedImagePath));
} else if (requestCode == CAPTURE_IMAGE) {
selectedImagePath = getImagePath();
imgUser.setImageBitmap(decodeFile(selectedImagePath));
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
}
public Bitmap decodeFile(String path) {
try {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, o);
// The new size we want to scale to
final int REQUIRED_SIZE = 70;
// Find the correct scale value. It should be the power of 2.
int scale = 1;
while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
scale *= 2;
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeFile(path, o2);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
public String getAbsolutePath(Uri uri) {
String[] projection = { MediaColumns.DATA };
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(uri, projection, null, null, null);
if (cursor != null) {
int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else
return null;
}
これを試して、昨日は同じ問題があった。以下のコードを使用して、問題を修正します。試してみてください。
注:また、特定のアクティビティにconfigChanges
を追加します。カメラのインテントアクティビティの呼び出し中に更新されます。それを避ける必要があります。 Android:configChanges="orientation|keyboardHidden|screenSize"
btnGallery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 1);
}
});
btnCapture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment
.getExternalStorageDirectory(),
"test.jpg");
outputFileUri = Uri.fromFile(file);
Log.d("TAG", "outputFileUri intent"
+ outputFileUri);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
outputFileUri);
startActivityForResult(intent, 0);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 0:
if (resultCode == RESULT_OK) {
Log.d("TAG", "outputFileUri RESULT_OK" + outputFileUri);
if (outputFileUri != null) {
Bitmap bitmap;
bitmap = decodeSampledBitmapFromUri(outputFileUri,
image.getWidth(), image.getHeight());
if (bitmap == null) {
Toast.makeText(getApplicationContext(),
"the image data could not be decoded",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(
getApplicationContext(),
"Decoded Bitmap: " + bitmap.getWidth() + " x "
+ bitmap.getHeight(), Toast.LENGTH_LONG)
.show();
image.setImageBitmap(bitmap);
}
}
}
break;
case 1:
if (resultCode == RESULT_OK) {
Uri targetUri = data.getData();
Log.d("TAG", "datae" + targetUri);
Bitmap bitmap;
bitmap = decodeSampledBitmapFromUri(targetUri,
image.getWidth(), image.getHeight());
if (bitmap == null) {
Toast.makeText(getApplicationContext(),
"the image data could not be decoded",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(
getApplicationContext(),
"Decoded Bitmap: " + bitmap.getWidth() + " x "
+ bitmap.getHeight(), Toast.LENGTH_LONG)
.show();
image.setImageBitmap(bitmap);
}
}
break;
default:
break;
}
}
public Bitmap decodeSampledBitmapFromUri(Uri uri, int reqWidth,
int reqHeight) {
Bitmap bm = null;
try {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(getContentResolver()
.openInputStream(uri), null, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
bm = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(uri), null, options);
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), e.toString(),
Toast.LENGTH_LONG).show();
}
return bm;
}
public 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;
}
次の行が問題の原因だと思います。
Bitmap photo = (Bitmap) data.getExtras().get("data");
次のようにファイルuriをすでに渡します
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
EXTRA_OUTPUTをURIで渡すと、onActivityResult()で受け取るインテントはnullになります。このメソッドで画像を取得する場合は、EXTRA_OUTPUTで渡したパスで画像を取得します。
よりクリーンなコードは、答えを探している人を助けるかもしれません、基本的にあなたが外部ストレージバンドルにファイルを保存するとき、結果にはビットマップがありません、代わりにファイルからロードする必要があります
String fileName;
.
.
private void takePicture() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
loadImageFromFile();
}
}
public void loadImageFromFile(){
ImageView view = (ImageView)this.findViewById(R.id.imageViewHeader);
view.setVisibility(View.VISIBLE);
int targetW = view.getWidth();
int targetH = view.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(fileName, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(fileName, bmOptions);
view.setImageBitmap(bitmap);
}
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
fileName = image.getAbsolutePath();
return image;
}