2016-04-16 28 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 error ocurred”)替换为Log.e(TAG,“Searchable,Catch error ocurred”,ex)'。这样,您将获得异常的Java堆栈跟踪并可以了解错误。 – CommonsWare

+0

@MilanNz错误是:E/MainActivity:java.io.IOException:打开失败:EACCES(权限被拒绝) – Jake

回答

1

好吧,你使用的是Android 6.0或更高的目标。从Android 6.0开始,我们运行时间权限,这意味着仅仅在AndroidManifest.xml中添加存储权限是不够的。

欲了解更多信息,请参阅以下链接: http://developer.android.com/training/permissions/requesting.html

这是很容易实现,你有你的链接需要上面。

BR米兰