2017-02-27 59 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