[英]How to save Bitmap image to SD Card/Device gallery
更新
我想將位圖圖像保存到SD卡/設備庫中。 我嘗試了這個和這個 。 代碼正在運行,我正在模擬器上對其進行檢查。 每當我保存圖像時,圖庫中都沒有任何內容。 請幫忙
日志報告
07-25 02:57:34.345: E/MainActivity(1249): Error in creating fragment
07-25 02:57:35.476: I/Choreographer(1249): Skipped 95 frames! The application may be doing too much work on its main thread.
07-25 02:57:51.955: D/dalvikvm(1249): GC_FOR_ALLOC freed 1409K, 21% free 5888K/7400K, paused 46ms, total 73ms
07-25 02:57:51.955: I/dalvikvm-heap(1249): Grow heap (frag case) to 6.959MB for 1166416-byte allocation
07-25 02:57:52.085: D/dalvikvm(1249): GC_FOR_ALLOC freed 44K, 6% free 6983K/7400K, paused 53ms, total 53ms
07-25 02:57:52.266: I/Choreographer(1249): Skipped 60 frames! The application may be doing too much work on its main thread.
07-25 02:57:55.556: D/dalvikvm(1249): GC_FOR_ALLOC freed 2621K, 34% free 5702K/8568K, paused 42ms, total 44ms
07-25 02:57:55.606: W/System.err(1249): java.io.FileNotFoundException: /storage/sdcard/MyFolder/storage/sdcard/MyFolder/ pic.jpg: open failed: ENOENT (No such file or directory)
07-25 02:57:55.606: W/System.err(1249): at libcore.io.IoBridge.open(IoBridge.java:409)
07-25 02:57:55.606: W/System.err(1249): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
07-25 02:57:55.616: W/System.err(1249): at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
07-25 02:57:55.616: W/System.err(1249): at com.example.navigationexample.MainActivity.saveImage(MainActivity.java:314)
07-25 02:57:55.626: W/System.err(1249): at com.example.navigationexample.MainActivity.onOptionsItemSelected(MainActivity.java:148)
07-25 02:57:55.626: W/System.err(1249): at android.app.Activity.onMenuItemSelected(Activity.java:2566)
07-25 02:57:55.639: W/System.err(1249): at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:372)
07-25 02:57:55.639: W/System.err(1249): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:986)
07-25 02:57:55.646: W/System.err(1249): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
07-25 02:57:55.646: W/System.err(1249): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
07-25 02:57:55.646: W/System.err(1249): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
07-25 02:57:55.658: W/System.err(1249): at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:547)
07-25 02:57:55.658: W/System.err(1249): at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115)
07-25 02:57:55.658: W/System.err(1249): at android.view.View.performClick(View.java:4240)
07-25 02:57:55.666: W/System.err(1249): at android.view.View$PerformClick.run(View.java:17721)
07-25 02:57:55.676: W/System.err(1249): at android.os.Handler.handleCallback(Handler.java:730)
07-25 02:57:55.676: W/System.err(1249): at android.os.Handler.dispatchMessage(Handler.java:92)
07-25 02:57:55.676: W/System.err(1249): at android.os.Looper.loop(Looper.java:137)
07-25 02:57:55.686: W/System.err(1249): at android.app.ActivityThread.main(ActivityThread.java:5103)
07-25 02:57:55.695: W/System.err(1249): at java.lang.reflect.Method.invokeNative(Native Method)
07-25 02:57:55.695: W/System.err(1249): at java.lang.reflect.Method.invoke(Method.java:525)
07-25 02:57:55.695: W/System.err(1249): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
07-25 02:57:55.706: W/System.err(1249): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-25 02:57:55.706: W/System.err(1249): at dalvik.system.NativeStart.main(Native Method)
07-25 02:57:55.716: W/System.err(1249): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
07-25 02:57:55.726: W/System.err(1249): at libcore.io.Posix.open(Native Method)
07-25 02:57:55.726: W/System.err(1249): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
07-25 02:57:55.726: W/System.err(1249): at libcore.io.IoBridge.open(IoBridge.java:393)
07-25 02:57:55.736: W/System.err(1249): ... 23 more
07-25 02:57:56.056: I/Choreographer(1249): Skipped 32 frames! The application may be doing too much work on its main thread.
保存函數public void saveImage(Bitmap bitmap){
String fname = path + " pic" + ".jpg";
File file = new File (dir, fname);
//if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
image.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
用於在SD卡中創建文件夾的功能。 我在setContentView之后調用了此方法,並在要保存它時調用saveImage函數
public void makeFolderInSdCard() {
path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyFolder/";
dir = new File(path);
if(!dir.exists())
dir.mkdirs();
}
您是否在清單文件中添加了權限?
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在setContentView()之后,在SD卡中創建一個文件夾,如下所示:
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyFolder/";
File dir = new File(path);
if(!dir.exists())
dir.mkdirs();
然后創建一個新文件,如下所示:
String s = path + "pic" + ".jpg";
File newfile = new File(s);
然后使用FileOutputStream存儲圖像。 希望這可以幫助。 另外,為什么還要使用file.delete()?
//代替這個
String fname = path + " pic" + ".jpg";
File file = new File (dir, fname);
// 用這個
String fname = "pic" + ".jpg";
File file = new File (dir , fname);
正確檢查您的日志文件。 它顯示“ java.io.FileNotFoundException:/ storage / sdcard / MyFolder / storage / sdcard / MyFolder / pic.jpg”。
此處重復“ / storage / sdcard / MyFolder”,這看起來像無效路徑。 因此,有效路徑應為“ /storage/sdcard/MyFolder/pic.jpg”。
您需要設置在AndroidManifest.xml文件的權限和功能。 在您的AndroidManifest.xml中添加以下內容
它應該看起來像這樣:
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> <!-- Accessing camera hardware --> <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
....
那么您需要一個目錄名稱來存儲您捕獲的圖像
私有靜態最終字符串IMAGE_DIRECTORY_NAME =“您的目錄名稱”;
然后一個文件的URL來存儲圖像
私人Uri fileUri;
另外,您還將使用MediaStore.EXTRA_OUTPUT在以下示例代碼中指定必須存儲圖像的路徑:
intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
單擊此處以獲取更多將來參考
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.