2

我要做的是创建一个新文件夹并将相机捕获的图像保存在该文件夹中。我正在尝试使用以下片段来实现它:

public class DocsAdd extends Activity
{   
    private static int TAKE_PICTURE = 1;
    private Uri outputFileUri;
    Bitmap thumbnail;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        File filename;
        try 
        {
            long currentTime = System.currentTimeMillis();
            String fileName = "img" + currentTime+".jpg";
            String path = Environment.getExternalStorageDirectory().toString();             
            filename = new File(path + "/AutoistDiary/"+ fileName);
            FileOutputStream out = new FileOutputStream(filename);            
            out.flush();
            out.close();     
            MediaStore.Images.Media.insertImage(getContentResolver(),filename.getAbsolutePath(), filename.getName(), filename.getName());

          outputFileUri = Uri.fromFile(filename);
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, TAKE_PICTURE);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        if (requestCode == TAKE_PICTURE)
        {
            Uri imageUri = null;            
            if (data!=null) 
            {
                if (data.hasExtra("data")) 
                {
                    thumbnail = data.getParcelableExtra("data");
                    Intent docsShow_intent=new Intent(this,DocsShow.class);
                    startActivity(docsShow_intent);
                }
            } 
            else 
            {
            }

        }  
    }
}

但是当我在 Optimus1 上运行它时,它没有向我的活动返回任何结果,遇到了一个链接Camera on Android Example,它说明了我目前面临的相同问题,因此可以帮助我解决这个问题。?

4

1 回答 1

4

不幸的是,当您在相机的意图中使用标志时,某些设备上存在一个错误,导致Intend data参数 inonActivityResult为空。MediaStore.EXTRA_OUTPUT一种解决方法是保持outputFileUri变量全局,以便您可以在您的onActivityResult方法中再次访问它。像这样的东西:

Uri outputFileUri; //global variable

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo= new File(Environment.getExternalStorageDirectory(), "Autoist Diary"); 

if (! photo.exists())  
{  
    photo.mkdirs();  
    if (! photo.mkdirs())  
    {  
        Log.i("MyCameraApp", "failed to create directory");  
    }  
}  
puc_img=new File(photo,"Puc_Img.jpg");  
outputFileUri = Uri.fromFile(photo);  
intent.putExtra(MediaStore.EXTRA_OUTPUT,outputFileUri);  
StartActivityForResult(intent, TAKE_PICTURE);  

public void onActivityResult(int requestCode, int resultCode, Intent data)  
{  
    super.onActivityResult(requestCode, resultCode, data);  
    switch (requestCode)   
    {  
       case TAKE_PICTURE:  
           if (resultCode == Activity.RESULT_OK)   
           {                   
               if(data != null) { //if the intent data is not null, use it
                  puc_image = getImagePath(Uri.parse(data.toURI())); //update the image path accordingly
                  StoreImage(this,Uri.parse(data.toURI()),puc_img);
               }
               else { //Use the outputFileUri global variable
                  StoreImage(this,outputFileUri,puc_img);
               }
           }   
       break;
    }  
}  
public static void StoreImage(Context mContext, Uri imageLoc, File imageDir)  
{  
    Bitmap bm = null;  
    try   
    {  
        bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);  
        FileOutputStream out = new FileOutputStream(imageDir);  
        bm.compress(Bitmap.CompressFormat.JPEG, 100, out);  
        bm.recycle();  
    }  
    catch (FileNotFoundException e)   
    {  
        e.printStackTrace();  
    }  
    catch (IOException e)   
    {  
       e.printStackTrace();  
    }  
    catch (Exception e)   
    {  
        e.printStackTrace();  
    }  
}
public String getImagePath(Uri uri) {
    String selectedImagePath;
    // 1:MEDIA GALLERY --- query from MediaStore.Images.Media.DATA
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if (cursor != null) {
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        selectedImagePath = cursor.getString(column_index);
    } else {
        selectedImagePath = null;
    }

    if (selectedImagePath == null) {
        // 2:OI FILE Manager --- call method: uri.getPath()
        selectedImagePath = uri.getPath();
    }
    return selectedImagePath;
}

这种解决方法对我有用。希望有帮助。

于 2012-07-21T10:16:52.650 回答