1

嗨我正在爲我的實習製作應用程序,並且出現錯誤。
請幫我解決這個錯誤捕捉照片和顯示縮略圖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

回答

1

默認的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

您的歡迎。樂於幫助 :) –