2016-02-07 39 views
1

每當我在nexus 7上運行此應用程序時,它都會允許我拍攝圖像,但是當我接受圖像時說「保存照片或圖像時出現問題」。我相信這是因爲我的設備沒有外部存儲器,我將如何修改此代碼以允許其保存在其自己的文件夾中的內部存儲器上,然後將圖像顯示在圖像視圖上進行編輯。嘗試保存圖像時出錯

public class MainActivity extends Activity { 

Button button; 
ImageView imageView; 
static final int CAM_REQUEST = 1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    button = (Button) findViewById(R.id.CameraButton); 
    imageView = (ImageView)findViewById(R.id.Image_view); 
    button.setOnClickListener(new View.OnClickListener() { 

@Override 
      public void onClick(View v) { 
     Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     File file = getfile(); 
       camera_intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
       startActivityForResult(camera_intent, CAM_REQUEST); 
      } 
     }); 
    } 

private File getfile() 
{ 

    File folder = new File("=sdcard/Camera_App"); 

    if(!folder.exists()) //CHECKS FOR FOLDER 
    { 
     folder.mkdir(); //IF NO FOLDER IT CREATES FOLDER 
    } 

    File image_file = new File(folder, "Image.jpg"); 
    return image_file; 
} 

@Override 
protected void onActivityResult (int requestCode, int resultCode, Intent data) { 
String path = "sdcard/Camera_App/Image.jpg"; 
    imageView.setImageDrawable(Drawable.createFromPath(path)); 

} 


} 
+0

02-07 17:19:17.037 10173-10173/aaronmiller.comp4_project E/BitmapFactory:無法解碼流:java.io.FileNotFoundException:/sdcard/Camera_App/Image.jpg:打開失敗:ENOENT(沒有這樣的文件或目錄) –

回答

1

我相信這是因爲我的設備沒有外部存儲

這將是相當令人吃驚。合法擁有Play商店的所有設備均附帶external storage

如何將我修改此代碼,使其能夠在內部存儲保存在自己的文件夾

這不可能是實際的。其他應用無法訪問您的應用的internal storage。您可以嘗試編寫一個ContentProvider,它提供對流的寫訪問權限,並支持內部存儲器上的文件,但我懷疑許多相機應用程序不知道如何處理content://Uri作爲EXTRA_OUTPUT傳入。

此外,你的問題更可能是你的硬編碼路徑。你有兩條這樣的路徑。兩者都不一樣,都不正確。使用方法like getExternalFilesDir()(可在Context上獲得,子類如Activity)或Environment.getExternalStoragePublicDirectory()獲取根目錄進行存儲,然後使用File構造函數來引用這些目錄的內容。

例如,這項活動需要的圖片,然後啓動第三方圖像查看器來顯示結果:

package com.commonsware.android.camcon; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import java.io.File; 

public class CameraContentDemoActivity extends Activity { 
    private static final int CONTENT_REQUEST=1337; 
    private File output=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File dir= 
     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 

    output=new File(dir, "CameraContentDemo.jpeg"); 
    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output)); 

    startActivityForResult(i, CONTENT_REQUEST); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
    if (requestCode == CONTENT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
     Intent i=new Intent(Intent.ACTION_VIEW); 

     i.setDataAndType(Uri.fromFile(output), "image/jpeg"); 
     startActivity(i); 
     finish(); 
     } 
    } 
    } 
} 

(這項活動真正需要的File保存在onSaveInstanceState()Bundle,萬一我們應用程序的進程終止而相機的應用程序是在前臺。我會更新the sample app最終解決這個問題。)

至於填入一ImageView,我懷疑createFromPath()會做磁盤I/O和圖像解碼上主要的應用程序線程,這將凍結你的用戶界面,而這正在發生。有many image-loading libraries for Android可以採取您的FileUri並異步填充您的ImageView

+0

我將如何修改您提供的示例代碼,而不是在第三方應用程序中打開圖像視圖中的圖像。對不起,我是java的新手。同樣在你提供的代碼中,當啓動時應用程序打開相機,如何在按下按鈕時修改它以打開相機。 –

+0

我已經實現了一個按鈕,但我仍然不確定如何在圖像視圖中打開圖像而不是第三方應用程序 –