2013-09-27 12 views
21

私の問題を解決するのに本当に不満を抱いています。私がcameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);写真を使用していないときにアクティビティに表示されますが、名前とパスファイルは私が望むものとは異なります。アンドロイドカメラ:結果の配信に失敗しましたResult result {who = null、request = 0、result = -1、data = null}アクティビティ

{ 

       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方法:

私はそれをコンパイルするため銀河タブを使用しています、私は hereherehereが、私のアプリケーションがまだ近いとEROR強制から、これは私のコードで私の問題を解決するためのチュートリアルに従う持っています
@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 

、私はすでによ誰かに助けてください...ありがとうございました。

+0

これはnullポインタ例外です。FormSpaj.java:993という行は何ですか? –

+0

ビットマップphoto =(ビットマップ)data.getExtras()。get( "data"); –

+0

'getExtras()'は、追加バンドルがない場合にnullを返すことができます。 'getExtras()'から返された値が 'null'でないことを確認する必要があります。 – jedwards

答えて

20

は、私は同じ問題を抱えていた昨日、これを試してみてください

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; 
    } 
+0

あなたの助けてくれてありがとう...しかし、私は別のイメージをキャプチャするとき、なぜこれまでに作成したイメージを書き換えていないのですか? –

+0

このメソッドsetImageUri()には、現在の時間ミリ秒を追加して一意のURIを生成するためです。ファイルを上書きする場合は、setImageUri()メソッドで静的にハードコードされたファイル名を指定します。 –

+0

私はこのようにしています:File file = new File(Environment.getExternalStorageDirectory()+ "/ android/data/spaj_foto/spaj_foto.png"); Uri imgUri = Uri.fromFile(file); this.imgPath = file.getAbsolutePath(); –

6

私と一緒に、これは魅力のように働いているお試しください。以下のコードを使用して問題を解決します。ただ試してみてください。

注:また、特定のアクティビティには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; 
} 
3

よりクリーンなコード、あなたが外部ストレージバンドルはこれ以上の結果でビットマップを持っているにファイルを保存するときの答えを探している誰かが、基本的には、代わりにあなたは私がファイル

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; 
} 
+0

これは助けになりました。ありがとうございました!私はまだ 'Bitmap picture =(Bitmap)data.getExtras()。get(" data ");' – RichArt

2

からロードする必要が役立つかもしれません次の行が問題を引き起こすと考えてください。

Bitmap photo = (Bitmap) data.getExtras().get("data"); 

はあなたがURI、あなたが(onActivityResultで受信を意図してEXTRA_OUTPUTを渡す場合はnullになります)

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); 

を次のように既にファイルのURIを渡します。このメソッドでイメージを取得する場合は、EXTRA_OUTPUTを渡したパスでイメージを取得します。

+0

にしようとしていました。私はAndroid 7.0でクラッシュの問題に直面し始め、このラインを削除することがそのトリックでした。また、この行を削除しても、ヌルガング前のデバイスには影響しませんでした。 Android 4.4以上からテストされています。 –

関連する問題