0

我写了一个安卓代码来拍照(使用安卓相机应用程序)。我想将这张照片保存在外部存储中,所以我使用 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 版本有关吗?

4

2 回答 2

1

要在 SD 卡上获取 root derictory,您可以使用:

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" />
于 2012-12-13T12:20:09.990 回答
0

SmartRoutes目录似乎不存在。mkdirs设置后尝试添加storageDir。所以它会是:

storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/SmartRoutes", fileName);
storageDir.mkdirs();
于 2015-04-07T11:27:50.633 回答