2014-02-19 25 views
0

我無法將圖像保存到設備上的內存中。我查看了其他主題並實施了這些主題,但沒有任何效果可以幫助我。如果任何人都可以指出我正確的方向,將不勝感激。我也無法將圖像保存到SD卡,因爲我的平板電腦沒有。這裏是我的代碼保存到內存android

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 

import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.app.Activity; 
import android.content.Context; 
import android.content.ContextWrapper; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.BitmapFactory.Options; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainActivity extends Activity 
{ 
// Request codes for Activities 
private static final int CAPTURE_IMAGE_REQUEST = 100; 
private static final int MEDIA_TYPE_IMAGE = 1; 
private static final int LINK_TO_DROPBOX = 150; 

// Directory name to store captured images 
private static String IMAGE_DIRECTORY_NAME = "Android to Dropbox"; 

// Uri to store images 
private Uri fileUri; 

private ImageView imagePreview; // To preview image 
private Button captureImage; // To launch camera intent 
private Button linkDropbox;  // Link users Dropbox account 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    imagePreview = (ImageView)findViewById(R.id.imagePrview); 
    captureImage = (Button)findViewById(R.id.imageCapture); 
    linkDropbox = (Button)findViewById(R.id.linkToDropbox); 

    // Go to method to start camera intent to capture image 
    captureImage.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 
      captureImage(); 
     } 
    }); 

    // Check if user is connected to their Dropbox account 
    linkDropbox.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 
      linkToDropbox(); 
     } 
    }); 
}// End onCreate 

@Override 
protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putParcelable("file_uri", fileUri); 
}// End onSavedInstanceState 

// Restore fileUri 
@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) 
{ 
    super.onRestoreInstanceState(savedInstanceState); 
    fileUri = savedInstanceState.getParcelable("file_uri"); 
}// End onRestoreInstanceState 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
}// End onCreateOptionsMenu 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(requestCode == CAPTURE_IMAGE_REQUEST) 
    { 
     if(resultCode == RESULT_OK) // Successfully captured image 
      previewCapturedImage(); 
     else if(resultCode == RESULT_CANCELED) // User cancelled image capture 
      Toast.makeText(getApplicationContext(), "User cancelled image capture", Toast.LENGTH_SHORT).show(); 
     else // Failed to capture image 
      Toast.makeText(getApplicationContext(), "Failed to capture image", Toast.LENGTH_SHORT).show(); 
    } 
}// End onActivityResult 

// Method to launch camera within app 
private void captureImage() 
{ 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
    startActivityForResult(intent, CAPTURE_IMAGE_REQUEST); 
}// End captureImage 

// Check if user has linked to their Dropbox account 
private void linkToDropbox() 
{ 

}// End linkToDropbox 

// Preview captured image 
private void previewCapturedImage() 
{ 
    try 
    { 
     imagePreview.setVisibility(View.VISIBLE); // Show ImageView 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 8; 

     final Bitmap image = BitmapFactory.decodeFile(fileUri.getPath(), options); 
     imagePreview.setImageBitmap(image); 
     saveToInternalMemory(image); // TRY TO SAVE IMAGE IN INTERNAL MEMORY 
    } 
    catch(NullPointerException e) 
    { 
     e.printStackTrace(); 
    } 
}// End previewCapturedImage 

// Method to save image to inernal memory 
public void saveToInternalMemory(Bitmap image) 
{ 
    boolean ableToSave = true; 
    File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
    if(pictureFile == null) 
    { 
     Toast.makeText(getApplicationContext(), "Failed to save image", Toast.LENGTH_SHORT).show(); 
     ableToSave = false; 
    } 

    if(ableToSave) 
    { 
     try 
     { 
      FileOutputStream stream = new FileOutputStream(pictureFile); 
      image.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      stream.close(); 
     } 
     catch(FileNotFoundException e) 
     { 
      Toast.makeText(getApplicationContext(), "File not found", Toast.LENGTH_SHORT).show(); 
     } 
     catch(IOException e) 
     { 
      Toast.makeText(getApplicationContext(), "Error accessing file", Toast.LENGTH_SHORT).show(); 
     } 
    } 
}// End saveToInternalMemory 

// Create file uri to store image 
public Uri getOutputMediaFileUri(int type) 
{ 
    return Uri.fromFile(getOutputMediaFile(type)); 
}// End getOutputMediaFileUri 

// Return image 
private static File getOutputMediaFile(int type) 
{ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), IMAGE_DIRECTORY_NAME); 
    File mediaFile; 

    if(!mediaStorageDir.exists()) 
    { 
     if(!mediaStorageDir.mkdirs()) 
     { 
      Log.d(IMAGE_DIRECTORY_NAME, "Failed to create " + IMAGE_DIRECTORY_NAME + " directory"); 
      mediaFile = null; 
     } 
    } 

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); // Image name 

    if(type == MEDIA_TYPE_IMAGE) 
    { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 
    } 
    else 
     mediaFile = null; 

    return mediaFile; 
}// End getOutputMediaFile 

}// End MainActivity 

編輯:看起來像這段代碼是爲我工作。照片不會顯示在我的設備上,除非我重新啓動它,然後它們會出現在我的照片應用程序中。

+0

您需要指定您正面臨的問題。此外,在這裏複製所有代碼只會讓人們難以閱讀和理解。請僅包含您遇到問題的部分。 –

+0

您是否找到任何解決方案?我陷入了同樣的問題。我可以寫圖像到外部存儲位不是內部:( –

回答

0

在您保存方法,嘗試這樣做:

String FILENAME = "hello_file"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
image.compress(Bitmap.CompressFormat.PNG, 100, fos); 
fos.close(); 

查看開發者文檔的更多信息。 http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

另注爲什麼當前的代碼可能無法正常工作 - 在你的getOutputMediaFile方法,你正在創建使用外部存儲目錄中的新文件:

​​

1

保存:

FileOutputStream outStream = null; 
File sdCard = Environment.getExternalStorageDirectory(); 
File dir = new File(sdCard.getAbsolutePath() + "/YourFolderName"); 
dir.mkdirs(); 
String fileName = String.format("%d.jpg", System.currentTimeMillis()); 
File outFile = new File(dir, fileName); 
outStream = new FileOutputStream(outFile); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 
outStream.flush(); 
outStream.close(); 

給出清單權限,並進入設備設置>設備>應用程序>應用程序管理器>「您的應用程序」>權限>啓用存儲權限!