2017-02-27 60 views
0
package ar.camera; 

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.widget.Toast; 


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

import static android.provider.MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE; 

public class MainActivity extends AppCompatActivity { 

    static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1; 
    private Uri fileUri; 

    //create the file URI 
    private static Uri getOutputMediaFileUri(int type) { 
     return Uri.fromFile(getOutputMediaFile(type)); 
    } 


    private static File getOutputMediaFile(int type){ 

     final File mediaStorageDir; 

     if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 
      mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "EMFDetectingApp"); 
     } else{ 
      mediaStorageDir = new File ("/storage/sdcard0/EMFDetectingApp"); 
     } 

     if( !mediaStorageDir.exists()){ 
      if (! mediaStorageDir.mkdirs()){ 
       Log.d("EMFDectectingApp", "failed to create directory"); 
       return null; 
      } 
     } 

     //create a media file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     File mediaFile = null; 
     if(type == MEDIA_TYPE_IMAGE) { 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 
      return mediaFile; 
     } else{ 
      return null; 
     } 



    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

     //create the uri of a file to save the image 
     fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

     //specifying the path and file name for teh received image 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
     if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE){ 
      if(resultCode == RESULT_OK){ 
       //image cpatured and saved to fileUri specifies in the Intent 
       Toast.makeText(this, "Image successfully saved", Toast.LENGTH_SHORT).show(); 
      } 
      else if(resultCode == RESULT_CANCELED){ 
       Toast.makeText(this, "Image capture cancelled", Toast.LENGTH_SHORT).show(); 

      } 
      else{ 
       Toast.makeText(this, "Image capture failed", Toast.LENGTH_SHORT).show(); 

      } 
     } 
    } 


} 

我创建了一个应用程序,它使用相机拍摄图像并保存。但是,当我运行上面的代码时,我可以拍照,但图像无法保存。我无法找到它在画廊或SD卡。任何人都可以在这段代码中找到错误吗?无法将图像保存到存储 - Android

回答

1

任何人都可以在这段代码中找到错误吗?

  • 要调用startActivityForResult()您完成建立Intent —呼叫putExtra()以前之前调用startActivityForResult()

  • 决不硬编码路径(例如,/storage/sdcard0/EMFDetectingApp),因为这样的路径可能不存在于所有设备上。

  • 如果是removable storage,则无法在Android 4.4及更高版本的设备上输入/storage/sdcard0/

  • 不能使用在Android 7.0+设备Uri.fromFile(),如果你的targetSdkVersion为24或更高

  • 您的照片将不会到Windows/Mac系统/ Linux的可见的,或者最画廊的应用程序,直到你have MediaScannerConnection index the photo

+0

当我打电话startActivityForResult之前调用putExtra,我的应用程序不会打开它说:“相机一直停止” – Programmer

+0

还什么是安卓7.0 – Programmer

+0

@Programmer的替代Uri.fromFile():“我的应用程序不会打开说“相机保持停止” - 使用LogCat从另一个应用程序检查Java堆栈跟踪。 “什么是替代Ur.fromFile()为Android 7.0” - “FileProvider”。 [这个示例应用程序](https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider)实现'FileProvider'以与'ACTION_IMAGE_CAPTURE'一起使用。 – CommonsWare