2016-04-16 18 views
1

私のプロジェクトでは一度も写真を撮ったことがありませんでしたので、おそらく愚かな質問をすることをお詫びします。基本的には、次のコードを使用して画像を撮ってから一時ファイルに保存しています。私は何のエラーもなかったが、何も起こっていない。コードの最後の部分でIOExceptionがスローされていることがわかりました。それがなぜ起こっているのか分かっているなら、私は本当にあなたの助けに感謝します。ありがとうございました! 権限は使用: 私のアプリでアンドロイドカメラを使って混乱しています

<uses-feature android:name="android.hardware.camera" 
           android:required="true" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

コード:

import android.content.Intent; 
    import android.net.Uri; 
    import android.os.Environment; 
    import android.provider.MediaStore; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.widget.Button; 

    import java.io.File; 
    import java.io.IOException; 
    import java.text.SimpleDateFormat; 
    import java.util.Date; 

    public class MainActivity extends AppCompatActivity { 
     static final int REQUEST_IMAGE_CAPTURE = 1; 
     private static final String TAG = "MainActivity"; 
     String mCurrentPhotoPath; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      Button takePicButton = (Button)findViewById(R.id.takePicButton); 
      takePicButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        dispatchTakePictureIntent(); 
       } 
      }); 
     } 

     private File createImageFile() throws IOException { 
      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 */ 
      ); 

      mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
      return image; 
     } 
     static final int REQUEST_TAKE_PHOTO = 1; 

     private void dispatchTakePictureIntent() { 
      Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
       File photoFile = null; 
       try { 
        photoFile = createImageFile(); 
       } catch (IOException ex) { 
        Log.i(TAG, "Searchable, Catch error ocurred"); 

       } 
       if (photoFile != null) { 
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
          Uri.fromFile(photoFile)); 
        startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
       } 
      } 
     } 
    } 
+0

ポスト例外メッセージ... – MilanNz

+0

は例外自体をログインせずに、例外をキャッチしないでください。 'Log.i(TAG、" Searchable、catch ocurred ")'を 'Log.e(TAG、" Searchable、catch ocurred "、ex)'に置き換えます。この方法では、例外のJavaスタックトレースを取得し、何が間違っているかを知ることができます。 – CommonsWare

+0

@MilanNzエラー:E/MainActivity:java.io.IOException:オープンに失敗しました:EACCES(アクセスが拒否されました) – Jake

答えて

1

を[OK]を、あなたがターゲットとしてのAndroid 6.0以上を使用しています。 Android 6.0からは実行時の権限があります。つまり、AndroidManifest.xmlにストレージ権限を追加するだけでは不十分です。実装が容易であり、あなたがあなたが上記のリンクで必要としてい http://developer.android.com/training/permissions/requesting.html

:詳細については

は、以下のリンクを参照してください。

BRミラノ