2014-09-22 74 views
0

我在三星注測試我的應用程序, 這裏是我如何用來調用相機相機活動返回null URI

Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(captureIntent, CAMERA_CAPTURE); 

然後在活動結果:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode == RESULT_OK) 
    { 
     if(requestCode == CAMERA_CAPTURE) 
     { 
      picUri = data.getData(); 
      //continue my code 
     } 
    } 
} 

但後來我最近將測試更改爲Galaxy Nexus,並且我注意到data.getData()現在返回null而不是臨時圖像uri。 我讀了幾條建議,都提到將相機活動的文件傳遞給新的iamge的位置。 現在我改變了代碼:

.... 
File photoFile = createImageFile(); 
//photoFile = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); 
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
startActivityForResult(captureIntent, CAMERA_CAPTURE); 
.... 

使用方法

private File createImageFile() throws IOException 
{ 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    //File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "alboom"); 
    //File storageDir = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "alboom"); 
    //File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    //File storageDir = getFilesDir(); //not working 
    //File storageDir = getDir("mydir", Context.MODE_PRIVATE); //not working 
    //File storageDir = getCacheDir(); //not working 

    if (!storageDir.mkdirs()) //required if creating a new dir 
     Log.e(TAG, "Directory not created"); 

    //File image = File.createTempFile(imageFileName, ".jpg", storageDir); 
    File image = new File(storageDir, imageFileName); 
    //File image = File.createTempFile(imageFileName, ".jpg"); //not working 


    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

和結果處理

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode == RESULT_OK) 
    { 
     if(requestCode == CAMERA_CAPTURE) 
     { 
      picUri = Uri.fromFile(photoFile); 
      //continue my code 
     } 
    } 
} 

現在我的代碼工作很好,但只有當我寫外部存儲..內部存儲始終不會從相機活動返回。

我的問題是:

  1. 爲什麼不能我寫的內部存儲?
  2. 如何將「未隱藏」的圖像文件寫入外部存儲?
  3. 爲什麼舊代碼停止工作?
+0

「爲什麼我不能寫入內部存儲?」 - 因爲相機應用無法訪問應用的內部存儲空間。 – CommonsWare 2014-09-22 14:45:49

+0

是的。當你傳遞一個'EXTRA_OUTPUT'時,三星相機應用會從android 4.3返回null。但你真的不需要'data.getData()'Uri,因爲你已經知道Uri是什麼 – njzk2 2014-09-22 14:48:10

+0

謝謝@CommonsWare – sunil 2014-09-22 14:57:46

回答

0

有時候,儘管寫這樣的事情:

File source = null; 
source = new File(imageUri.getPath()); 

或:

Uri url= Uri.parse(stringPath); 

...這是可能的,你得到你的URI空值。它似乎與最後一個Android版本(4.4.4)的錯誤有關。那麼該怎麼辦?一個小竅門是給力的新形象,以節省刷新路徑:

Uri tempUri = getImageUri(getApplicationContext(), imageBitmap); 

(...)

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
    return Uri.parse(path); 
} 

試試吧!你也可以take a look at this

相關問題