错误捕捉照片和显示缩略图android studio

问题描述:

嗨我正在为我的实习制作应用程序,并且出现错误。
请帮我解决这个错误捕捉照片和显示缩略图android studio

这是activity.java

private void dispatchTakePictureIntent() { 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    // Ensure that there's a camera activity to handle the intents 
    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) { 
      Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.provider", photoFile); 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
     } 
    } 
} 

,这是onActivityResult()代码:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK && requestCode == REQUEST_TAKE_PHOTO) { 
     Bundle extras = data.getExtras(); 
     Bitmap imageBitmap = (Bitmap) extras.get("data"); 
     imageView.setImageBitmap(imageBitmap); 
    } 
    if (resultCode == Activity.RESULT_OK){ 
     if (requestCode == PICK_FILE_REQUEST){ 
      if (data == null){ 
       return; 
      } 

      Uri selectedFileUri = data.getData(); 
      selectedFilePath = FilePath.getPath(this, selectedFileUri); 
      Log.i(TAG,"Selected File Path:"+selectedFilePath); 

      if (selectedFilePath != null && !selectedFilePath.equals("")){ 
       tv_file_name.setText(selectedFilePath); 
      }else{ 
       Toast.makeText(this, "Cannot upload file to server", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 

和我得到这个

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { }} to activity {com.example.febryan.apptest/com.example.febryan.apptest.RequestActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference 
                      at android.app.ActivityThread.deliverResults(ActivityThread.java:4324) 
                      at android.app.ActivityThread.handleSendResult(ActivityThread.java:4367) 
                      at android.app.ActivityThread.-wrap19(Unknown Source:0) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1649) 
                      at android.os.Handler.dispatchMessage(Handler.java:105) 
                      at android.os.Looper.loop(Looper.java:164) 
                      at android.app.ActivityThread.main(ActivityThread.java:6541) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference 
                      at com.example.febryan.apptest.RequestActivity2.onActivityResult(RequestActivity2.java:311) 
                      at android.app.Activity.dispatchActivityResult(Activity.java:7235) 
                      at android.app.ActivityThread.deliverResults(ActivityThread.java:4320) 

请帮我解决这个问题。 thx

默认的Android相机应用程序仅在传回返回的Intent中的缩略图时返回非null意图。如果您通过带有URI的EXTRA_OUTPUT来写入,它将返回一个空的意图,并且图片位于您传入的URI中。

因此,由于您的意图传递了EXTRA_OUTPUT位置,它将始终使用数据重新调用null即现在您的情况下,照片/捕获的图像在photoURI路径。

因此,不要查看onActivityResult()中的数据意图,而是从photoURI路径中获取它。像below.Here照片文件是保存实际的摄像机图像

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK && requestCode == REQUEST_TAKE_PHOTO) { 

     Uri uri = Uri.fromFile(photoFile); // Here photo file is the file EXTRA_OUTPUT location where you saved the actual camera image 
     Bitmap bitmap; 
     try { 
      bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 
      bitmap = crupAndScale(bitmap, 300); // if you mind scaling 
      pofileImageView.setImageBitmap(bitmap); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     imageView.setImageBitmap(bitmap); 
    } 

} 

如果您想裁剪和缩放这个图像的文件EXTRA_OUTPUT位置,可能是因为你提到的缩略图。

public static Bitmap crupAndScale (Bitmap source,int scale){ 
    int factor = source.getHeight() <= source.getWidth() ? source.getHeight(): source.getWidth(); 
    int longer = source.getHeight() >= source.getWidth() ? source.getHeight(): source.getWidth(); 
    int x = source.getHeight() >= source.getWidth() ?0:(longer-factor)/2; 
    int y = source.getHeight() <= source.getWidth() ?0:(longer-factor)/2; 
    source = Bitmap.createBitmap(source, x, y, factor, factor); 
    source = Bitmap.createScaledBitmap(source, scale, scale, false); 
    return source; 
} 
+1

它的工作原理!谢谢!!!现在我必须将其上传到我的服务器 –

+0

您的欢迎。乐于帮助 :) –