2016年6月27日 星期一

read and save bmp in android




  重點是  out = openFileOutput(filename, Context.MODE_WORLD_READABLE);

這個是權限的意思...

Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
1. Context.MODE_PRIVATE:為預設操作模式,代表該檔是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔的內容,


2. Context.MODE_APPEND:模式會檢查檔是否存在,存在就往檔追加內容,否則就創建新檔。

3. Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔。
MODE_WORLD_READABLE:表示當前檔可以被其他應用讀取;MODE_WORLD_WRITEABLE:表示當前檔可以被其他應用寫入。
如果希望檔被其他應用讀和寫,可以傳入:
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如檔的時候,就需要userid匹配。預設情況下,任何應用創建的檔,sharedpreferences,資料庫都應該是私有的(位於/data/data/<package name>/files),其他程式無法訪問。除非在創建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程式才能正確訪問。



public void savebmp(Bitmap bmp){
String filename = "out.bmp";
FileOutputStream out = null;
try {
out = openFileOutput(filename, Context.MODE_WORLD_READABLE);
//out = new FileOutputStream("out.bmp");
bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
// PNG is a lossless format, the compression factor (100) is ignored
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


 Bitmap bmp = readbmp("/data/data/com.ford.openxc.webcam/files/out.bmp");

 public Bitmap readbmp(String filename){
   
    Bitmap bitmap = BitmapFactory.decodeFile(filename);
    return bitmap;
   
    }

讀取檔內容


public void load()
{
try {
          FileInputStream inStream=this.openFileInput("a.txt");
          ByteArrayOutputStream stream=new ByteArrayOutputStream();
          byte[] buffer=new byte[1024];
          int length=-1;
          while((length=inStream.read(buffer))!=-1) {
              stream.write(buffer,0,length);
    }
    stream.close();
    inStream.close();
    text.setText(stream.toString());
    Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
    } catch (FileNotFoundException e) {
         e.printStackTrace();
    }
    catch (IOException e){
      return ;
    }
}

把檔放入SD卡


使用Activity的openFileOutput()方法保存檔,檔是存放在手機空間上,一般手機的存儲空間不是很大,存放些小檔還行,如果要存放像視頻這樣的大檔,是不可行的。對於像視頻這樣的大檔,我們可以把它存放在SDCard。 SDCard是幹什麼的?你可以把它看作是移動硬碟或U盤。

在模擬器中使用SDCard,你需要先創建一張SDCard卡(當然不是真的SDCard,只是鏡像檔)。創建SDCard可以在Eclipse創建模擬器時隨同創建,也可以使用DOS命令進行創建,如下:

在Dos視窗中進入android SDK安裝路徑的tools目錄,輸入以下命令創建一張容量為2G的SDCard,檔尾碼可以隨便取,建議使用.img:

mksdcard 2048M D:\AndroidTool\sdcard.img

在程式中訪問SDCard,你需要申請訪問SDCard的許可權。

在AndroidManifest.xml中加入訪問SDCard的許可權如下:

<!-- 在SDCard中創建與刪除檔許可權 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 往SDCard寫入資料許可權 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


要往SDCard存放檔,程式必須先判斷手機是否裝有SDCard,並且可以進行讀寫。

注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目錄

File saveFile = new File(sdCardDir, “a.txt”);

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("test".getBytes());

outStream.close();

}

Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED

Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄,當然要獲取SDCard的目錄,你也可以這樣寫:

File sdCardDir = new File("/sdcard"); //獲取SDCard目錄

File saveFile = new File(sdCardDir, "itcast.txt");

//上面兩句代碼可以合成一句: File saveFile = new File("/sdcard/a.txt");

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("test".getBytes());

outStream.close();


ref : http://fecbob.pixnet.net/blog/post/35618216-android%E8%B3%87%E6%96%99%E5%84%B2%E5%AD%98-%E3%80%90%E8%BD%89%E3%80%91-

沒有留言:

張貼留言