㈠ android 保存圖片到本地。
這里只介紹按下「保存」後如何將一個Bitmap對象保存為圖片文件的執行步驟,對圖片的下載,圖片到Bitmap對象的轉換,Bitmap對象的格式轉換和壓縮,以及界面設計部分全部都忽略了。
確定存儲路徑
獲取外部存儲許可權
確定外部存儲狀態
確定文件名
保存到文件中
發送廣播,通知系統掃描保存後的文件
確定存儲路徑
在Android中文件存儲路徑包括內部存儲和外部存儲兩種類型。
對內部存儲,當一個app被安裝到手機後,Android系統會在內部存儲的/data/data/目錄下創建一個以包名稱命名的文件夾。例如/data/data/com.sohu.inputmethod.sogou/。一個應用對內部存儲的所有訪問都被限制在這個文件夾中,也就是說Android應用只能在該目錄中讀取,創建,修改文件。對該目錄之外的其他內部存儲中的目錄都沒有任何操作的許可權。因此,如果將圖片保存在內部存儲中,只能被應用自身讀取,其他應用均無法讀取。如果需要讓系統圖庫,相冊或其他應用能夠找到保存的圖片,必須將圖片保存到外部存儲中。
對外部存儲,當一個app被安裝到手機後,Android系統會在外部存儲的/Android/data/目錄下創建一個以包名命名的文件夾(這里第一個/不是根路徑,而是相對外部存儲所掛載路徑的相對路徑)。例如/storage/emulated/0/Android/data/com.sohu.inputmethod/。這個路徑同樣只能被應用自身讀取,其他應用不能訪問。因此,也不能將圖片保存在這個目錄中。
除外部存儲的/Android目錄之外的其他目錄一般都是可以被其他應用訪問的。目前,大多數應用都會在外部存儲的根路徑下建立一個類似包名的多層目錄,以存儲需要共享的文件。例如/storage/emulated/0/sogou/image/。還需要注意的是,很多查看圖片的應用都支持按照文件夾來查看圖片。如果將圖片所在的文件夾取名為image,photo之類的,就無法和其他文件夾區分開,用戶也不能識別該文件夾的用途。因此最好取一個有區分度的文件夾名字,例如網路貼吧就保存在/tieba目錄,微信是保存在/tencent/MicroMsg/WeiXin目錄。
由於Android系統的碎片化問題,不同設備上外部存儲的路徑很可能會不同,因此,不能直接使用/storage/emulated/0/作為外部存儲的根路徑。
Android SDK中 Environment類 提供了getExternalStorageDirectory()方法來獲取外部存儲的根路徑。示例如下:
[java]view plain
Stringdir=Environment.getExternalStorageDirectory().getAbsolutePath()+"/tencent/MicroMsg/WeiXin/"
需要注意的是Environment.getExternalStorageDirectory()返回的路徑中最後一個字元不是/,如果需要創建子目錄,需要在子目錄的前後都加上/。
獲取外部存儲許可權
由於需要在外部存儲中寫文件,需要在AndroidManifest.xml中增加如下的許可權聲明。
[java]view plain
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
確定外部存儲狀態
由於外部存儲需要被掛載,也可以被卸載,在寫入文件之前,需要先判斷外部存儲的狀態是否正常。只有狀態正常情況下才可以執行保存文件的操作。獲取外部存儲狀態同樣是通過Environment類,通過Environment.getExternalStorageState()可以得到一個字元串,來表示外部存儲的狀態。同時在Environment類中定義了一系列的String常量表示不同的狀態。在所有的狀態中只有內部存儲處於Environment.MEDIA_MOUNTED狀態時才可以讀寫文件,因此,需要將獲取到的狀態和Environment.MEDIA_MOUNTED做比較,如果不是Environment.MEDIA_MOUNTED狀態,就返回保存失敗。示例如下。
[java]view plain
//獲取內部存儲狀態
Stringstate=Environment.getExternalStorageState();
//如果狀態不是mounted,無法讀寫
if(!state.equals(Environment.MEDIA_MOUNTED)){
return;
}
確定文件名
保存的圖片文件名可以由應用根據自身需要自行確定,一般來說需要有一個命名規則,然後根據命名規則計算得到文件名。
這里列舉幾種常見的命名規則。
隨機命名
這種命名規則是隨機生成一個字元串或一組數字來對圖片命名。
字元串可以通過UUID來生成,數字可以通過Random()類來生成,例如:
[java]view plain
//通過UUID生成字元串文件名
StringfileName1=UUID.randomUUID().toString();
//通過Random()類生成數組命名
Randomrandom=newRandom();
StringfileName2=String.valueOf(random.nextInt(Integer.MAX_VALUE));
這種命名規則是按照數字從小到大的順序來對圖片命名。
在程序啟動時先獲取圖片文件名中當前最大數字的文件名,之後每保存一張圖片就將數字加1即可。
時間命名
這種命名規則是根據保存圖片的當前系統時間來對圖片命名。
系統時間可以通過System.currentTimeMillis()來獲取,不過System.currentTimeMillis()獲取到的時間是一個long型的整數,如果用它做文件名,無法通過文件名直接看出文件的具體保存時間。可以通過SimpleDateFormat先對當前時間做格式化,然後再將其作為文件名來使用。例如:
[java]view plain
使用這種命名規則來命名需要注意的是同一秒鍾可能會有多張圖片需要保存,在得到當前系統時間對應的文件名後,需要判斷該文件是否存在。如果文件已經存在,需要重新生成文件名。重新生成的文件名可以在之前的文件名後加上一個隨機數後綴,或者是用毫秒數做後綴。
Calendarnow=newGregorianCalendar();
SimpleDateFormatsimpleDate=newSimpleDateFormat("yyyyMMddHHmmss",Locale.getDefault());
StringfileName=simpleDate.format(now.getTime());
文件URL命名
每張網路圖片都有一個對應的圖片URL,可以根據圖片的URL來對圖片命名。
不過URL中會包含一些不能用作文件名的特殊字元,此外直接用URL來命名可能會帶來安全問題。為了避免這兩個問題,可以將圖片URL的MD5值作為文件名來使用。由於MD5是不可逆的,也就無法通過MD5值反向得到圖片URL,同時MD5值對應的字元串只包含[0-9A-Z],不包含特殊字元,可是作為文件名使用。
由於每張圖片的URL是唯一的,其對應的文件名也就是唯一的。如果需要每張網路圖片只能生成一個文件,不允許保存為多份拷貝,可以用這種命名規則。在得到URL對應的文件名後,先判斷文件是否已經存在,如果已經存在,直接覆蓋或不處理。
保存到文件中
保存圖片文件時,通過Bitmap的compress()方法將Bitmap對象壓縮到一個文件輸出流中,然後flush()即可。示例如下。
[java]view plain
try{
Filefile=newFile(dir+fileName+".jpg");
FileOutputStreamout=newFileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
}catch(Exceptione){
e.printStackTrace();
}
發送廣播,通知系統掃描保存後的文件
至此,已經實現將Bitmap對象保存成外部存儲中的一個jpg格式的文件。但此時該文件只是保存在外部存儲的一個目錄中,必須進入其所在的目錄中才可以看到。在系統圖庫,相冊和其他應用中無法看到新建的圖片文件。為了讓其他應用能夠知道圖片文件被創建,必須通知MediaProvider服務將新建的文件添加到圖片資料庫中。
Android系統中常駐一個MediaProvider服務,對應的進程名為android.process.media,此服務用來管理本機上的媒體文件,提供媒體管理服務。在系統開機或者收到外部存儲的掛載消息後,MediaProvider會調用MediaScanner,MediaScanner會掃描外部存儲中的所有文件,根據文件類型的後綴將文件信息保存到對應的資料庫中,供其他APP使用。
MediaScannerReceiver是一個廣播接收者,當它接收到特定的廣播請求後,就會去掃描指定的文件,並根據文件信息將其添加到資料庫中。當圖片文件被創建後,就可以發送廣播給MediaScannerReceiver,通知其掃描新建的圖片文件。示例如下。
[java]view plain
try{
Filefile=newFile(dir+fileName+".jpg");
FileOutputStreamout=newFileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
//保存圖片後發送廣播通知更新資料庫
Uriuri=Uri.fromFile(file);
sendBroadcast(newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri));
}catch(Exceptione){
e.printStackTrace();
}
圖片的非同步保存
保存圖片文件時,如果圖片很大,或需要同時保存多張圖片時,就需要較多的時間。為了避免阻塞UI線程,出現幀率下降或ANR,通常需要將圖片保存操作放到線程中去執行。當圖片保存完畢後通過sendMessage()方法通知UI線程保存結果。
將圖片保存放到後台線程去執行需要增加一些同步機制避免一些多線程問題。例如有兩張圖片需要保存,分別放到兩個線程中去執行,保存圖片時文件名以數字順序增加。第一個線程選中文件名為125.jpg,但此時文件還未創建,第二個線程判斷125.jpg不存在,於是也選取125.jpg作為文件名,兩張圖片就保存到同一個文件中了。
㈡ Android開發進階:如何讀寫Android文件
Android AndroidAndroidAndroid 主要有四大組件成: 主要有四大組件成: 主要有四大組件成: 主要有四大組件成: 主要有四大組件成: 主要有四大組件成: Activity Activity Activity、ContentProvider 、Serviceerviceervice 、Intent IntentIntent Intent組成。 組成。 Android AndroidAndroidAndroid 文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何文件的運行主要需讀寫 四大組。本將介紹如何Android AndroidAndroidAndroid 文件,希望對正在 文件,希望對正在 文件,希望對正在 文件,希望對正在 文件,希望對正在 進行 AndroidAndroid AndroidAndroidAndroid 開發的朋友有所幫助。 開發的朋友有所幫助。 開發的朋友有所幫助。 開發的朋友有所幫助。 開
㈢ android 下怎麼讀寫大文件
試試ex文件管理 或者是re文件管理 祝你好運
㈣ android如何讀寫/data/data文件
讀寫文件,和java中沒有區別的Filefile=newFIle("文件絕對路徑");注意這里的文件路徑,windows平台下盤符是c:d:e:等android是linux內核,路徑是/開頭的其它的就是InputStreamoutputStream沒什麼區別
㈤ Android開發之如何讀寫文件
【轉】
首先介紹如何存儲數據,顯然,要將數據從應用中輸出到文件中,必須得到一個輸出流outPutStream,然後往輸出流中寫入數據,在這里Android自帶了一個得到應用輸出流的方法
FileOutputStream fos =context.openFileOutput(「yuchao.txt」,Context.MODE_PRIVATE); (1)
其中第一個屬性為文件名,第二個屬性為讀寫模式(有關讀寫模式的說明下面將詳細闡述),
然後在文件輸出流fos中便可以寫入數據
Fos.write(「Hi,」I』m Chao Yu!」.getBytes());
用完文件輸出流之後記得關閉
fos.close();
這樣,在/data/data/packageName/file目錄下就生成了一個文件名為yuchao.txt的文件,文件中的內容為」 Hi,I』m Chao Yu!」
有關(1)中讀寫模式其實就是制定創建文件的許可權以及在讀寫的時候的方式,Android中提供了以下幾種讀寫模式
Context.MODE_PRIVATE = 0
該模式下創建的文件其他應用無權訪問,並且本應用將覆蓋原有的內容
Context.MODE_APPEND = 32768
該模式下創建的文件其他應用無權訪問,並且本應用將在原有的內容後面追加內容
Context.MODE_WORLD_READABLE = 1
該模式下創建的文件其他應用有讀的許可權
Context.MODE_WORLD_WRITEABLE = 2
該模式下創建的文件其他應用有寫的許可權
如果需要將文件設置為外部應用可以讀寫,可將讀寫模式設置為Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE
一般情況下,各個應用維護的數據都在一個特定的文件夾中,即上面所提到的/data/data/packageName/file(存在於手機存儲中),但手機內存畢竟有限,所以有些情況下,我們需要往SD卡中寫入數據文件,這其實和普通的java web 應用步驟一樣,都是先創建特針對特定目錄特定文件的輸出流,然後往輸出流中寫數據,這里要注意一個方法,就是獲取SD卡根目錄的方法,隨著Android系統不斷升級,SD卡的根目錄隨時都有可能改變,Android中得到SD卡根目錄的方法是
File sdCardDir = Environment.getExternalStorageDirectory();
然後就可以進行下面的步驟
File saveFile = new File(sdCardDir, 「yuchao.txt」);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("Hi,I』m ChaoYu".getBytes());
outStream.close();
值得注意的是,在往SD卡中寫數據的時候,健壯的代碼必須考慮SD卡不存在或者防寫的情況,故在寫入之前,先做判斷
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
……
}
接著,我們來學習下我們的應用程序如何讀取文件中的數據,其實就是寫的逆向過程
若要讀取應用程序默認維護的文件(即/data/data/packageName/file目錄下的文件),首先得到文件輸入流
FileInputStream istream = this.context.openFileInput(「yuchao.txt」);
然後在內存中開辟一段緩沖區
byte[] buffer = new byte[1024];
然後創建一個位元組數組輸出流
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
讀出來的數據首先放入緩沖區,滿了之後再寫到字元輸出流中
while((len=istream.read(buffer))!=-1){
ostream.write(buffer, 0, len);
}
最後關閉輸入流和輸出流
istream.close();
ostream.close();
將得到的內容以字元串的形式返回便得到了文件中的內容了,這里的流操作較多,故以一張圖片來說明,見圖1
return new String(ostream.toByteArray());
從SD卡中讀取數據與上述兩個步驟類似,故不再贅述,留給讀者自己思考
如在開發過程中進行SD卡地讀寫,切忌忘了加入許可權
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
至此,Android系統中有關文件數據的讀寫介紹完畢。
㈥ android 讀寫文件需要哪些許可權
<!--往sdcard中寫入數據的許可權 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!--在sdcard中創建/刪除文件的許可權 --><uses-permission android:name="android.permission.MOUNT_U
android中的apk必須簽名
這種簽名不是基於權威證書的,不會決定某個應用允不允許安裝,而是一種自簽名證書。
重要的是,android系統有的許可權是基於簽名的。比如:system等級的許可權有專門對應的簽名,簽名不對,許可權也就獲取不到。默認生成的APK文件是debug簽名的。
獲取system許可權時用到的簽名,見:如何使Android應用程序獲取系統許可權。基於UserID的進程級別的安全機。這種簽名不是基於權威證書的,不會決定某個應用允不允許安裝,而是一種自簽名證書。重要的是,android系統有的許可權是基於簽名的。
㈦ Android開發如何讀取並顯示word和pdf文檔
通過對資料庫的索引,我們還為您准備了:
Android開發如何讀取並顯示word和pdf文檔呢
問:有做過類似項目的朋友講一下么?
答:大家好! 我是個Android新手,最近有個項目,其中有個需求就是在Android應用程序中查看word和pdf格式的文檔(PS:不是用intent調用第三方軟體打開文檔哦~),可惜Android沒有直接顯示word和pdf文檔的view。於是本菜鳥上網查了好久好久好久哇= =...
===========================================
android開發中怎樣讀取一個文件里的內容並把內容顯...
問:我以為和java的讀寫文件一樣的,但他好像有自己的獲取輸入輸出留的方法...
答:基本上都差不多。 一般來說。文件,XML都放在assets這個文件夾下。
===========================================
android怎麼讀取帶有圖片的WORD文檔
問:我以為和java的讀寫文件一樣的,但他好像有自己的獲取輸入輸出留的方法...
答:用Document to go或者quick office這類軟體就可以了。這些軟體在機鋒市場和豌豆莢里一搜就有
===========================================
【Android開發】請問Android怎麼打開word文件?
問:請問Android怎麼打開word文件?網上看了好多,但都不能運行,有的說用PO...
答:用quick ooffice,在網路移動應用上下載quick office(pro版),拷貝到手機,安裝好就行
===========================================
android編程:怎樣讀取txt文件
問:請問Android怎麼打開word文件?網上看了好多,但都不能運行,有的說用PO...
答:StringBuffer buffer = new StringBuffer(); try { FileInputStream fis = new FileInputStream("/sdcard/XXX.txt"); InputStreamReader isr = new InputStreamReader(fis,"GB2312");//文件編碼Unicode,UTF-8,ASCII,GB2312,Big5 Reader in = new...
===========================================
Android開發中讀寫office文件(word,ppt,excel)...
問:最近在寫一個基於android平台的辦公套件,其中設計到對word,ppt,excel...
答:簡單的,可以使用POI處理 想處理復雜和能用的,只有在伺服器端處理,再返回手機android查看
===========================================
Android開發 ,如何讀取AndroidMainfest.xml裡面的...
問:AndroidMainfest.xml文件如下:我想在Androd程序中讀取android:largeHea...
答:largeheap是一個布爾類型的
===========================================
android程序中如何打開並編輯word,excel等文件?
問:我現在已經使用POI包,將內容放在html里,在webview上顯示出來,但是不...
答:word?excel?笑話,微軟都沒有開發基於安卓版本的word,不過最近應該有動作了把。但是,你的軟體和人家的軟體,是屬於兩個APP,最多是給你個介面讓你啟動,但是至於編輯,你得看看人家的應用有沒給你介面
===========================================
android開發中,如何實現讀取pdf格式的文件,並把...
問:最近做關於android開發,讀取pdf格式文件的應用,但是不知道如何下手啊...
答:得嵌入PDF第三方軟體或自己編寫一個類似的打開軟體吧,否則理論上是看不了的。(僅供參考)