-2

私はアンドロイドの開発には初めてです。私はクリック時に画像をキャプチャするボタンを持っています。ボタンをクリックすると、nullポインタ例外エラーがスローされます。ここでアンドロイド - ヌルポインタファイルURI上の例外

が、私はディレクトリを作成するために、マニフェストファイルにアクセス権を追加しました私の主な活動方法

btnCapturePicture.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     captureImage(); 
    } 
    }); 
    /** 
     Record video button click event 
    */ 
    btnRecordVideo.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     // record video 
     recordVideo(); 
     } 
     }); 
    // Checking camera availability 
    if (!isDeviceSupportCamera()) { 
    Toast.makeText(getApplicationContext(), 
    "Sorry! Your device doesn't support camera", 
    Toast.LENGTH_LONG).show(); 
    // will close the app if the device does't have camera 
    finish(); 
    } 
    } 
/** 
 checking device has camera hardware or not 
  */ 
private boolean isDeviceSupportCamera() { 
if (getApplicationContext().getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) { 
// this device has a camera 
return true; 
} else { 
// no camera on this device 
return false; 
} 
} 
/** 
     * Launching camera app to capture image 
     */ 
private void captureImage() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
    // start the image capture Intent 
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 
} 
/** 
     * Launching camera app to record video 
     */ 
private void recordVideo() { 
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); 
    // set video quality 
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);// set the image file 
    // name 
    // start the video capture Intent 
    startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE); 
} 
    /** 
         * Here we store the file url as it will be null after returning from camera 
         * app 
         */ 
    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     // save file url in bundle as it will be null on screen orientation 
     // changes 
     outState.putParcelable("file_uri", fileUri); 
    } 
    @Override 
    protected void onRestoreInstanceState (Bundle savedInstanceState){ 
     super.onRestoreInstanceState(savedInstanceState); 
     // get the file url 
     fileUri = savedInstanceState.getParcelable("file_uri"); 
    } 
    /** 
         * Receiving activity result method will be called after closing the camera 
         * */ 
    @Override 
    protected void onActivityResult (int requestCode, int resultCode, Intent data){ 
     // if the result is capturing Image 
     if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       // successfully captured the image 
       // launching upload activity 
       launchUploadActivity(true); 
      } else if (resultCode == RESULT_CANCELED) { 
       // user cancelled Image capture 
       Toast.makeText(getApplicationContext(), 
         "Sorry! Failed to capture image", Toast.LENGTH_SHORT).show(); 
      } 
     } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) { 
      if (resultCode == RESULT_OK) { 
       // video successfully recorded 
       //launching upload activity 
       launchUploadActivity(false); 
      } else if (resultCode == RESULT_CANCELED) { 
       // user cancelled recording 
       Toast.makeText(getApplicationContext(), "Sorry! Failed to  record video", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
private void launchUploadActivity(boolean isImage){ 
    Intent i = new Intent(MainActivity.this, UploadActivity.class); 
    i.putExtra("filePath", fileUri.getPath()); 
    i.putExtra("isImage", isImage); 
    startActivity(i); 
} 

/** 
     * Creating file uri to store image/video 
     */ 
public Uri getOutputMediaFileUri(int type) { 
return Uri.fromFile(getOutputMediaFile(type)); 
} 

/** 
     * returning image/video 
     */ 
private static File getOutputMediaFile(int type) { 

    // External sdcard location 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      Config.IMAGE_DIRECTORY_NAME); 

    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d(TAG, "Oops! Failed create "+ Config.IMAGE_DIRECTORY_NAME + " directory"); 
      return null; 
     } 
    } 
    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.getDefault()).format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator+ "IMG_" + timeStamp + ".jpg"); 
    } else if (type == MEDIA_TYPE_VIDEO) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator+ "VID_" + timeStamp + ".mp4"); 
    } else { 
     return null; 
    } 
    return mediaFile; 
} 
} 

であるここに私のManifest.xmlファイルがある

android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="11" 
     android:targetSdkVersion="23" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

マイデバッガのエラーメッセージは、この

です
Process: com.example.sathwik.uploadtrail1, PID: 2406 
       java.lang.NullPointerException: file 
        at android.net.Uri.fromFile(Uri.java:452) 
        at com.example.sathwik.uploadtrail1.MainActivity.getOutputMediaFileUri(MainActivity.java:163) 
        at com.example.sathwik.uploadtrail1.MainActivity.captureImage(MainActivity.java:90) 
        at com.example.sathwik.uploadtrail1.MainActivity.access$000(MainActivity.java:21) 
        at com.example.sathwik.uploadtrail1.MainActivity$1.onClick(MainActivity.java:50) 
+0

は 'getOutputMediaFile(int型)' '戻っnull'なのでように見えます。デバッガを使用して、なぜ – Jens

答えて

1

あなたのコードを実行しました。写真を撮って保存しています。あなたが行方不明になっている可能性があります、一度Settings> App> YourAppに行き、アクセス許可をチェックしてください。また、 'mediaStorageDir'と 'mediaFile'がnullでないことを確認してください。そこにいくつかのログを入れてください。

+0

がUri.fromFile(getOutputMediaFile(type))を返すかを調べる。 –

+1

これはコメントでなければなりません。 –

+0

これはうまくいきました...あなたは答えました...私はupvote –

1

あなたは
<uses-permission android:name="android.permission.CAMERA" /> を使用していないようなあなたのマニフェストから、見て、私はあなたのコード内で
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); を見つけました。

+0

マニフェストファイルにカメラ権限が追加されました。同じエラーがスローされます –

0

この機能を試してください:

private void captureImage(){ 
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
          /* create instance of File with name img.jpg */ 
        File file = new File(Environment.getExternalStorageDirectory() + File.separator + "img.jpg"); 
          /* put uri as extra in intent object */ 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
        intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

        startActivityForResult(intent, 1); 
} 
+0

この機能を試してみましたが、同じエラーが発生しました –

+0

このアクセス許可を追加してください。

+0

関連する問題