android圖片讀取
① android中如何從SDcard中讀取圖片文件
用路徑的方法尋找,BitmapFactory.decodeFile(路徑)返回值是一個Bitmap,比如sdcard的根目錄有個test.png,那麼可以這么用BitmapFactory.decodeFile("mnt/sdcard/test.png")。然後ImageView之類的圖片控制項,可以用setImageBitmap(Bitmap)之類的方法,就可以使用sdcard中的圖片了,
不過好像需要加一個許可權的,就是在androidmanifest.xml中添加。
你說的讀取系統一個小圖標R.drawable.ic_menu_camera,其實也是用路徑尋找的,不過被google封裝起來了,用映射的方法尋找到相關路徑下的文件。 比如R.drawable 就知道是res下面drawable-XX(根據系統配置,尋找不同文件夾下的圖片)文件下的圖片,比如R.layout 就是res下面layout下面的文件。SimpleAdapter可以算是一個測試用的設配器,最好自己嘗試寫設配器,自由空間比較大。
② android 讀取圖片流為空
直接用BitmapFactory.decodeFile(pathName);就可以讀取。
或者用你的方式,BitmapFactory.decodeStream(fosfrom);
而且你這種讀取方式也不對。你把一個圖片分成多次讀取,ByteArrayInputStream流里只保存了最後一份數據,怎麼可能是個完整的圖片。
③ android怎麼用流 讀取雲端圖片
在java 直接用BitmapFactory.decodeFile(pathName);就可以讀取。
或者用你的方式,BitmapFactory.decodeStream(fosfrom);
SE的學習過程中,我們就接觸到了I/O流的概念,並且使用了一些文件輸入輸出流的API來將數據保存到文件或者是從文件中讀取數據。同樣,這個手段也適用於Android系統,我們可以在應用開發過程中使用文件相關的API方法。
何謂內部存儲呢?實際上就是指將程序的私有數據以文件的形式存儲在Android設備的內存中。同理,如果是存放在SD卡等地方,就稱之為外部存儲。
我們在,你需要建立文件的輸入輸出流,並在流中操作數據。
首先是寫文件。
為了使用內部存儲向文件中寫入一些數據,你可以調用openFileOutput()方法,需要的參數為文件名和寫入模式。寫入模式實際上就是該文件的許可權歸屬,可以是公有的,也可以是私有的。如何具體地創建一個文件輸出流呢,具體方式如下:
FileOutputStream fileOut =
openFileOutput("file_name",MODE_WORLD_READABLE);
//第一個參數即文件名,第二個參數表示文件存儲的模式
對於第二個參數,需要補充的是:文件存儲的模式公有四種:
MODE_PRIVATE:該模式是默認的,通過該模式創建的文件是私有的,即只能被應用本身訪問。注意:在該模式下寫入的內容會覆蓋原有的內容。
MODE_APPEND:與上個模式類似,但在寫入內容時會檢查待創建的文件是否存在。若文件已被創建,則往該文件中追加內容,而不是覆蓋原來的內容;若文件未被創建,則創建新的文件。
MODE_WORLD_READABLE:表示當前創建的這個文件允許被其他應用讀取。
MODE_WORLD_WRITEABLE:表示當前創建的這個文件允許被其他應用寫入。
默認情況下,不僅是應用創建的文件,包括Shared
Preferences和資料庫,都是私有的。那麼問題來了,如果希望其他應用既能讀又能寫,應該怎麼辦呢?參考下面這種用法:
FileOutputStream fileOut = openFileOutput("file_name",MODE_WORLD_READABLE +
MODE_WORLD_WRITEABLE);
而對於openFileOutput()方法,它返回的是一個FileOutputStream實例。換言之,你通過文件輸出流對象中得到了這個實例,隨後你便可以調用寫相關的方法來向文件寫入數據。具體的用法如下:
String str = "shiyanlou";
//待寫入的數據
fOut.write(str.getBytes());
//實際上寫入文件的是一個位元組數組,我們用gettBytes()方法將其轉換成目標格式
fOut.close();
//記得寫入完畢後要用close()結束
接下來是讀文件。
怎樣讀取我們剛剛創建的這個文件呢?你應該猜到了,是使用openFileInput()方法。該方法需要填入待讀取文件的文件名,同樣,它返回的是一個FileInputStream的實例。具體用法如下:
FileInputStream fileIn = openFileInput(file);
在打開輸入流後,你可以調用read()方法每次從文件中讀出一個字元出來,然後裝入一個字元串變數中。具體做法如下:
int ch;
String temp="";
while( (ch = fin.read()) != -1){
temp = temp + Character.toString((char)ch);
//不斷地追加讀取的內容
}
//通過一個for循環,你最後得到的temp字元串包含了文件中的所有數據
fileIn.close();
//記得要關閉輸入流
除了上面我們用到的這些方法(比如write()、read()和close()),FileOutputStream和FileInputStream類中還有很多常用的方法,我們在下面作一簡要介紹。
FileOutputStream類中的其它常用方法:
write(byte[] b, int off, int len):該方法從指定的位元組數組開始到該文件輸出流關閉寫入len位元組。
getChannel():該方法返回一個只讀的、與文件輸出流關聯的文件通道對象(FileChannel)
getFD():該方法返回與此流有關的文件描述符對象(FileDescriptor)
FileInputStream類中的其它常用方法:
read(byte[] b, int off, int len):該方法從輸入流中數據讀取最多len個位元組到位元組數組
getChannel():該方法返回一個只讀的、與文件輸出流關聯的文件通道對象(FileChannel)
getFD():該方法返回與此流有關的文件描述符對象(FileDescriptor)
available():該方法可通過一個方法的調用者從輸入流中阻止這個輸入流返回可以讀取(或跳過)的位元組數的估計值。
四、在Android上實現文件讀寫
下面我們通過一個實例來學習如何將Java中常用的文件讀寫沿用到Android中去。
實驗步驟主要有:
(若你已在第二小節完成,請跳至下一步)使用Android
Studio創建應用項目FileIOPractice,包名為com.shiyanlou.android.fileiopractice,基於Android
5.1製作。同時添加MainActivity及其布局資源文件。
創建並打開AVD模擬器(鏡像選擇API22:Android 5.1.1)。
在res/layout/activity_main.xml資源文件放入一些文本框和按鈕。
在MainActivity.java中,初始化要用到的控制項,添加文件讀寫相關的代碼。
編譯並運行這個應用,等待應用安裝至模擬器,在模擬器中使用該應用。
現在你可以按照上述步驟自己完成該實驗。下面也給出了本實驗涉及到的源代碼和資源文件詳情,在必要時你可以使用它們。在注釋中我們也對一些模塊進行了詳細的講解。
以下是MainActivity的布局文件res/layout/activity_main.xml:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textview_domain"
android:text="Shiyanlou.com"
android:textSize="40dp"
android:textColor="#11AA8C"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView_appName"
android:text="File I/O Practice"
android:layout_below="@+id/textview_domain"
android:layout_centerHorizontal="true"
android:textColor="#000000"
android:textSize="40dp" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:hint="Input some text here."
android:focusable="true"
android:layout_marginTop="20dp"
android:layout_below="@+id/textView_appName"
android:layout_alignEnd="@+id/textView_appName"
android:layout_alignLeft="@+id/textView_appName"
android:layout_alignStart="@+id/textView_appName"
android:layout_alignRight="@+id/textView_appName"
android:inputType="textMultiLine"
android:minLines="5"
android:background="#DDDDDD" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView_data"
android:text="Text would be shown here."
android:layout_below="@+id/button_save"
android:layout_marginTop="10dp"
android:layout_centerHorizontal="true" />
android:layout_width="120dp"
android:layout_height="wrap_content"
android:id="@+id/button_save"
android:text="Save File"
android:textColor="#FFFFFF"
android:background="#11AA8C"
android:layout_alignLeft="@+id/textView_appName"
android:layout_alignStart="@+id/textView_appName"
android:layout_below="@+id/editText"
android:layout_marginTop="20dp"/>
android:layout_width="120dp"
android:layout_height="wrap_content"
android:id="@+id/button_load"
android:text="Load File"
android:textColor="#FFFFFF"
android:background="#11AA8C"
android:layout_alignTop="@+id/button_save"
android:layout_alignRight="@+id/editText"
android:layout_alignEnd="@+id/editText" />
以下是src/MainActivity.java中的源代碼:
package com.shiyanlou.android.fileiopractice;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class MainActivity extends Activity {
private Button button_save;
private Button button_load;
private TextView textView_status;
private EditText editText;
//聲明各個控制項
private String data;
private String file = "shiyanlou_file";
//聲明用於存放數據的變數data和文件名常量file
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button_save =(Button)findViewById(R.id.button_save);
button_load =(Button)findViewById(R.id.button_load);
editText =(EditText)findViewById(R.id.editText);
textView_status =(TextView)findViewById(R.id.textView_data);
//實例化各個控制項
//為按鈕設置點擊事件監聽器
//首先是保存按鈕(寫操作)
button_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
data = editText.getText().toString();
//調用getText()方法從文本框中讀取內容,使用toString()方法將其轉化為String類型數據,並存放到data變數中
try {
//對於文件讀寫操作應使用異常處理流程
FileOutputStream fileOut = openFileOutput(file, MODE_APPEND);
// 此處用到了MODE_PRIVATE,在新版本的Android系統中,不推薦使用MODE_WORLD_READABLE等模式
// 這是因為Android中為應用間的數據交互提供了更好的支持,如Content Privoder等,你可一進步了解
fileOut.write(data.getBytes());
//用write()方法保存數據
fileOut.close();
//關閉輸出流
Toast.makeText(getBaseContext(), "File saving completed.",
Toast.LENGTH_SHORT).show();
//用一個Toast來告訴用戶已經寫入完畢了
} catch (Exception e) {
e.printStackTrace();
}
}
});
//其次是讀取按鈕(讀操作)
button_load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
//同理,建立文件輸入流
FileInputStream fileIn = openFileInput(file);
int ch;
//聲明一個整型變數ch用於接收數據
String tempText = "";
//這里的tempText用於臨時存放讀取的數據(字元串)
while ((ch = fileIn.read()) != -1) {
//這里的-1是特定的狀態碼,表示文件讀取結束
//在while循環中逐個讀取數據,並追加到tempText中
tempText = tempText + Character.toString((char) ch);
//將ch轉化為字元
}
textView_status.setText(tempText);
//讀取完畢後將文字顯示出來
Toast.makeText(getBaseContext(), "File reading completed.",
Toast.LENGTH_SHORT).show();
//同樣用一個Toast告知用戶已經讀取完成
} catch (Exception e) {
}
}
});
}
}
檢查一下代碼,編譯並運行該應用。在模擬器中嘗試輸入一些信息,保存一下,再試著讀取它們。
④ android 存在資料庫中的動態圖片,如何讀取出來,顯示在ImageView中
實現的功能為從伺服器獲取圖片數據,在布局頁面上顯示。由於圖片的個數是不確定的,因此採用在布局頁面中定義多個ImageView來顯示圖片是不合理的。
(一)首先定義布局
android:id="@+id/id_layout_movie"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
(二)載入圖片顯示時獲取到布局文件
RelativeLayout rl_Movie = (RelativeLayout) findViewById(R.id.id_layout_movie);
(三)依次循環伺服器獲取的圖片數據,一張一張設置圖片顯示的位置
//newWidth為圖片顯示的寬度,newHeight為圖片顯示的高度
RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams( newWidth, newHeight);
設置lp1.leftMargin和lp1.topMargin的值
(四)最後設置rl_Movie.addView(iv, lp1)將圖片加入布局文件中
⑤ android應用程序中可以直接從資源文件之中進行圖片資源的讀取操作類是
Http網路工具類,主要包括httpGet、httpPost以及http參數相關方法,以httpGet為例:staticHttpResponsehttpGet(HttpRequestrequest)staticHttpResponse。
httpGet(java.lang.StringhttpUrl)staticStringhttpGetString(StringhttpUrl)包含以上三個方法,默認使用gzip壓縮,使用bufferedReader提高讀取速度。HttpRequest中可以設置url、timeout、userAgent等其他http參數HttpResponse中可以獲取返回內容、http響應碼、http過期時間(Cache-Control的max-age和expires)等前兩個方法可以進行高級參數設置及豐富內容返回,第三個方法可以簡單的傳入url獲取返回內容,httpPost類似。更詳細的設置可以直接使用HttpURLConnection或apache的HttpClient。源碼可見HttpUtils.java,更多方法及更詳細參數介紹可見HttpUtilsApiGuide。
⑥ Android 簡單的圖片查看器
說明:在文件管理器中,可以使用這個app來打開圖片
ImageView 常用的一些XML屬性和方法:
支持的scaleType 屬性:
在打開圖片的Activity里需要必須設置以下三個屬性:
可以通過設置 mimeType 來關聯對應的類型,比如: mimeType="vedio/* 關聯視頻格式的文件等。
詳細可以參考: Android 常用 mimeType 表
讀取圖片,需要寫入到外部存儲器(SD卡)的許可權:
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果是 API23 以上還需要動態許可權:
自定義許可權的格式: 包名.permission.許可權名
自定義許可權需要在 Manifest 文件里使用 <permission android:name="..." /> 語法 進行注冊。
PackageManager.PERMISSION_GRANTED 表示許可權允許; PackageManager.PERMISSION_DENIED 表示許可權拒絕。
⑦ android編程:讀取指定文件夾下所有png圖片
1、程序,把Assets中的圖像顯示出來
try {
BufferedInputStream bis = new BufferedInputStream(getAssets()
.open("a.bmp"));
Bitmap bm = BitmapFactory.decodeStream(bis);
imageView01.setImageBitmap(bm);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("==========file not found======");
}
2、原理:Android中的資源分析
資源是Android應用程序中重要的組成部分。在應用程序中經常會使用字元串、菜單、圖像、聲音、視頻等內容,都可以稱之為資源。通過將資源放到與apk文件中與Android應用程序一同發布,在資源文件比較大的情況下,可以通過將資源作為外部文件來使用,我們將分析如何在Android應用程序中存儲這些資源。
一、資源的存儲
在android中,資源大多都是保存在res目錄中,例如布局資源以XML文件的形式保存在res\layout目錄中;圖像資源保存著res\drawable目錄中;菜單資源保存在res\menu目錄中。ADT在生成apk文件時,這些目錄中的資源都會被編譯,然後保存到apk文件中。如果將資源文件放到res\raw目錄中,資源將在不編譯的情況下放入apk文件中。在程序運行時可以使用InputStream來讀取res\raw目錄中的資源。
如果使用的資源文件過大,我們可以考慮將資源文件作為外部文件單獨發布。Android應用程序會從手機內存或者SD卡讀取這些資源文件。
二、資源的種類
從資源文件的類型來劃分,我們可以將資源文件劃分為XML、圖像和其它。以XML文件形式存儲的資源可以放在res目錄中的不同子目錄里,用來表示不同種類的資源;而圖像資源會放在res\drawable目錄中。除此之外,可以將任意的資源嵌入Androidy應用程序中。比如音頻和視頻等,一般這些資源放在res\raw目錄中。
表1、 Android支持的資源
目錄 資源類型 描述
Res\values
XML
保存字元串、顏色、尺寸、類型、主題等資源,可以是任意文件名。對於字元串、顏色、尺寸等信息採用
Key-value形式表示,對於類型、主題等資源,採用其它形式表示
Res\layout
XML
保存布局信息。一個資源文件表示一個View或ViewGroup的布局
Res\menu
XML
保存菜單資源。一個資源文件表示一個菜單(包括子菜單)
Res\anim
XML
保存與動畫相關的信息。可以定義幀(frame)動畫和補間(tween)動畫
Res\xml
XML
在該目錄的文件可以是任意類型的XML文件,這些XML文件可以在運行時被讀取。
Res\raw
任意類型
在該目錄中的文件雖然也會被封裝在apk文件中,但不會被編譯。在該目錄中可以放置任意類型的文件,例如,各種類型的文檔、音頻、視頻文件等
Res\drawable
圖像
該目錄中的文件可以是多種格式的圖像文件,例如,bmp、png、gif、jpg等。在該目錄中的圖像不需要解析度非常高,aapt工具會優化這個目錄中的圖像文件。如果想按字流讀取該目錄下的圖像文件,需要將圖像文件放在res\raw目錄中。
assets
任意類型
該目錄中的資源與res\raw中的資源一樣,也不會被編譯。但不同的是該目錄中的資源文件都不會生出資源ID
三、資源文件的命名
每一個資源文件或資源文件中的key-value對都會在ADT自動生成的R類(在R.java文件中)中找到相對應的ID.其中資源文件名或key-value對中的key就是R類中的java變數名。因此,資源文件名好key的命名首先要符合java變數的命名規則。
除了資源文件和key本身的命名要遵循相應的規則外,多個資源文件和key也要遵循唯一的原則。也就是說,同類資源的文件名或key不能重復。例如,兩個表示字元串資源的key不能重復,就算這兩個key在不同的XML文件中也不行。
由於ADT在生成ID時並不考慮資源文件的擴展名,因此,在res\drawable、res\raw等目錄中不能存在文件名相同,擴展名不同的資源文件。例如在res\drawable目錄不能同時放置icon.jpg和icon.png文件。
四、資源使用示例
在Android SDK中不僅提供了大量的系統資源,而且還允許開發人員定製自己的資源。不管是系統資源,還是自定義的資源,一般都會將這些資源放在res目錄中,然後通過R類中的相應ID來引用這些資源。接下來將針對於XML類資源的使用進行分析。
XML資源實際上就是XML格式的文本文件,這些文件必須放在res\xml目錄中。可以通過Resources.getXml方法獲得處理指定XML文件的XmlResourceParser對象。實際上,XmlResourceParser對象處理XML文件的的過程主要是針對不同的狀態點處理相應的代碼,比如開始分析文檔、開始分析標簽、分析標簽完成等,XmlResourceParser通過調用next方法不斷更新當前的狀態。
下面的代碼,則是展示如何讀取res\xml目錄中的XML文件的內容,先在res\xml目錄中建立一個xml文件。將AndroidManifest.xml文件復制到res\xml目錄中,並改名為android.xml。
在准備完XML文件後,在onCreate方法中開始讀取XML文件的內容,代碼如下:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView=(TextView)findViewById(R.id.textview);
StringBuffer sb=new StringBuffer();
// 獲得處理android。xml文件的XmlResourceParser對象
XmlResourceParser xml=getResources().getXml(R.xml.android);
try
{
//切換到下一個狀態,並獲得當前狀態的類型
int eventType =xml.next();
while(true)
{
//文檔開始狀態
if(eventType == XmlPullParser.START_DOCUMENT)
{
Log.d("start_document","start_document");
}
//標簽開始狀態
else if(eventType ==XmlPullParser.START_TAG)
{
Log.d("start_tag",xml.getName());
//將標簽名稱和當前標簽的深度(根節點的depth是1,第2層節點的depth是2,類推)
sb.append(xml.getName()+"(depth:"+xml.getDepth()" ");
//獲得當前標簽的屬性個數
int count=xml.getAttributeCount();
//將所有屬性的名稱和屬性值添加到StringBuffer對象中
for(int i=0;i<count;i++)
{
sb.append(xml.getAttributeName(i)+":
"+xml.getAttributeValue(i)+"");
}
sb.append(")\n");
}
//標簽結束狀態
else if(eventType ==XmlPullParser.END_TAG)
{
Log.d("end_tag",xml.getName());
}
//讀取標簽內容狀態
else if(eventType ==XmlPullParser.TEXT)
{
Log.d("text","text");
}
//文檔結束狀態
else if(eventType ==XmlPullParser.END_DOCUMENT)
{
Log.d("end_document","end_document");
//文檔分析結束後,退出while循環
break;
}
//切換到下一個狀態,並獲得當前狀態的類型
eventType =xml.next();
}
textView.setText(sb.toString());
}
catch(Exception e) {}
}
二、如果想讀入文件
在使用getAssets().open("anhui.xml")返回輸人流之後,就可以以此為參數,後面的處理跟普通的java的處理相同。
⑧ android如何讀取sd卡的圖片並顯示
首先你要在AndroidManifest.xml申請讀取sdcard的許可權
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--向SDCard寫入數據許可權-->
關鍵代碼:
packagecom.sdcardread;
importjava.io.File;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.TextView;
importandroid.app.Activity;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
{
privateTextViewtextView1;
;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView1=(TextView)findViewById(R.id.textView1);
linearLayout1=(LinearLayout)findViewById(R.id.linearLayout1);
booleanisSdCardExist=Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);//判斷sdcard是否存在
if(isSdCardExist){
Stringsdpath=Environment.getExternalStorageDirectory()
.getAbsolutePath();//獲取sdcard的根路徑
textView1.setText("sd卡是存在的。以下是sdcard下的img25.jpg!");
Stringfilepath=sdpath+File.separator+"img25.jpg";
Filefile=newFile(filepath);
ImageViewimageView=newImageView(this);//創建一個imageView對象
if(file.exists()){
Bitmapbm=BitmapFactory.decodeFile(filepath);
//將圖片顯示到ImageView中
imageView.setImageBitmap(bm);
linearLayout1.addView(imageView);
}
}else{
textView1.setText("sd卡不存在!");
}
}
}