我写了一个Android代码拍照(使用Android相机应用程序)。我想将这张照片保存在外部存储器中,所以我使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)来获取目录路径。
这是我的代码:
public void takePhoto(View b){
/** Esta función recoge la pulsación del botón de tomar fotografía.
* Se encarga de lanzar la cámara de fotos del móvil y permitir al
* usario hacer una fotografía.
*
* Se comprueba si se puede almacenar la foto, para después enviarla
* al backend. Si no, no se permite hacer la foto.
*/
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Se crea un File con el path donde se quiere almacenar la foto
fileName = new String("Incidencia_"+new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())+".jpg");
storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/SmartRoutes", fileName);
//storageDir = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES)+"/SmartRoutes", fileName);
if(storageDir != null)
Log.d(logTag, "Path: "+storageDir.toString());
// y se pasa al intent como extra.
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(storageDir));
startActivityForResult(takePictureIntent, TAKE_PHOTO_CODE);
}
else
Toast.makeText(this, "No es posible sacar una fotografía", Toast.LENGTH_SHORT).show();
}
然后在onActivityResult()上,我尝试将照片存储在“storageDir”中,只需在LogCat中打印路径:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
/** En esta función se recogen los resultados de las activities lanzadas desde esta.
* En este caso la de la cámara de fotos.
*/
switch (requestCode) {
case TAKE_PHOTO_CODE:
if(resultCode == RESULT_OK){
Toast.makeText(this, "Foto tomada correctamente", Toast.LENGTH_SHORT).show();
// Se añade la foto a la galería
//Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
//photoFile = new File(storageDir.getAbsolutePath());
photoFile = storageDir;
Toast.makeText(this, "File.toString(): "+photoFile.toString(), Toast.LENGTH_SHORT).show();
}
else if(resultCode == RESULT_CANCELED){
Toast.makeText(this, "Foto cancelada", Toast.LENGTH_SHORT).show();
}
break;
}
}
问题是我已经在安装了Android 4.0.1的三星Nexus S设备和安装了Android 2.3.6的三星Galaxy Mini中测试了这个代码,它运行得很好。但是,当我尝试在三星Galaxy S3和三星Glaxy Note 2中测试代码时,都使用Android 4.1.1线路
storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/SmartRoutes", fileName);
总是返回null,所以storageDir = null,我不知道为什么。
可以是关于Android 4.1.1的内容吗?
答案 0 :(得分:1)
要获取SD卡上的根目录,您可以使用:
String extStorageDirectory = Environment.getExternalStorageDirectory().getAbsolutePath();
而不是
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) // Folder which used by camera/gallery app.
尝试在AndroidManifest.xml中添加此权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 1 :(得分:0)
似乎SmartRoutes
目录不存在。设置mkdirs
后尝试添加storageDir
。所以它会是:
storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/SmartRoutes", fileName);
storageDir.mkdirs();