2013-09-27 12 views
21

Ich habe wirklich frustriert, um mein Problem zu lösen, habe ich eine Anwendung, die Kamera, wenn Kamera ein Foto zu erfassen, wird es auf Aktivität angezeigt, wenn ich nicht cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); Foto wird auf Aktivität anzeigen, aber der Name und Pfaddatei ist nicht wie ich wollte. Ich verwende galaxy tab es für die Erstellung, habe ich Tutorial folgen mein Problem von here, here und here aber meine Anwendung noch zu lösen zwingen schließen und eror, dies ist mein Code:Android-Kamera: Fehler liefert Ergebnis ResultInfo {wer = null, request = 0, result = -1, data = null} zu Aktivität

{ 

       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 Methode:

@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); 
     } 

das ist mein logcat sagt:

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 

ich mich wirklich hoffe jemand helfen kann, mein Problem zu lösen, ich bereits s tack und kann sowieso nicht mehr nachdenken, bitte hilft mir jemand ... danke.

+0

Dies ist nur eine Ausnahme Nullzeiger, was ist die Zeile FormSpaj.java:993? –

+0

Bitmap-Foto = (Bitmap) data.getExtras(). Get ("Daten"); –

+0

'getExtras()' kann null zurückgeben, wenn kein Extras-Bundle vorhanden ist. Sie sollten sicherstellen, dass der von 'getExtras() 'zurückgegebene Wert nicht' null 'ist. – jedwards

Antwort

20

Versuchen Sie, diese sind wie Charme der Arbeit mit mir

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

Vielen Dank für Ihre Hilfe ... aber ich habe eine Frage, warum, wenn ich ein anderes Bild erfassen, ist dies nicht das Bild, das zuvor erstellt haben, neu schreiben? –

+0

, weil wir in dieser Methode setImageUri() ein einzigartiges uri generieren, indem wir die aktuelle Zeit in Millisekunden anhängen. Wenn Sie die Datei überschreiben möchten, geben Sie in der Methode setImageUri() den statischen fest codierten Dateinamen an. –

+0

Ich habe so gemacht: Datei file = neue Datei (Environment.getExternalStorageDirectory() + "/ android/data/spaj_foto/spaj_foto.png"); Uri imgUri = Uri.fromFile (Datei); this.imgPath = file.getAbsolutePath(); –

6

Try this, gestern habe ich gleiches Problem hatte. Unter Verwendung von Code korrigiere ich das Problem. Versuch es einfach.

Hinweis: Und auch hinzufügen configChanges für bestimmte Aktivität. Während des Aufrufs der Kamera wird die Absichtsaktivität aktualisiert. du musst das vermeiden. 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

Mehr Code sauberer, könnte jemand helfen, für Antwort suchen, im Grunde, wenn Sie Datei auf externe Speicherbündel nicht mehr hat Bitmap in Folge speichern, stattdessen müssen Sie aus der Datei laden

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

Das hat geholfen. Vielen Dank! Ich habe immer noch versucht, Bitmap Bild = (Bitmap) data.getExtras(). Get ("Daten"); – RichArt

2

I denke, folgende Zeile verursacht das Problem.

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

Sie passieren die Datei uri bereits folgend

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); 

Wenn Sie EXTRA_OUTPUT mit einem URI übergeben, der Absicht, Sie in onActivityResult receive() null sein wird. Wenn Sie ein Bild in dieser Methode erhalten möchten, holen Sie das Bild mit dem Pfad, den Sie mit EXTRA_OUTPUT übergeben haben.

+0

Das funktioniert wirklich. Ich fing an, auf Android 7.0 mit dem Absturzproblem konfrontiert zu werden, und das Entfernen dieser Linie tat den Trick. Das Entfernen dieser Linie hatte auch keine Auswirkungen auf Pre-Nougat-Geräte. Getestet von Android 4.4 und höher. –

Verwandte Themen