當前位置:首頁 » 安卓系統 » android從本地獲取圖片

android從本地獲取圖片

發布時間: 2022-05-14 18:03:03

⑴ android關於網路上獲取圖片後保存在本地的問題

private InputStream ins = null;

....

HttpClient httpClient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(server_path_up);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpClient.execute(httppost);
HttpEntity entity = response.getEntity();

ins = entity.getContent();

這個ins是一個數據流,然後通過BitmapFactory.decodeStream(ins)就可以得到這個圖片了。得到圖片後保存到sd卡上,也是通過數據流保存,方法雷同。

⑵ 問個android 問題。我在做個注冊界面,要在本地獲取圖片做為頭像,然後存到sdcard裡面,這要怎麼做。

本地獲取圖片為頭像?啥?
默認頭像圖片,你放在drawable下面就好,當用戶修改頭像之後,你把圖片保存到SD卡某個路徑下,以一定的命名規則 命名, 然後下次到這個路徑通過你所定的命名去載入圖片就好,沒有就再從網路獲取,然後再保存到SD卡

⑶ android,如何將獲取的本地圖片其設為我的應用界面的背景

Android本身不提供使用圖片路徑來設置view背景的。既然我們已經知道了圖片的path,就可以先將圖片轉成drawable,然後在設置給LinearLayout來做背景。

⑷ 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 獲取系統相冊圖片並顯示在當前頁面的代碼

先初始化;

注意自定義 的

private final String IMAGE_TYPE = "image/*";private final int IMAGE_CODE = 0;


private void setImage() {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE);}
這里使用Intent獲得相冊圖片數據,並返回原來界面;

這里說明一下

startActivityForResult(getAlbum, IMAGE_CODE);

補充{

startActivityForResult與startActivity的不同之處在於:
1、startActivity( )
僅僅是跳轉到目標頁面,若是想跳回當前頁面,則必須再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成這項任務,當程序執行到這段代碼的時候,假若從T1Activity跳轉到下一個Text2Activity,而當這個Text2Activity調用了finish()方法以後,程序會自動跳轉回T1Activity,並調用前一個T1Activity中的onActivityResult( )方法。

}

startActivityForResult(getAlbum, IMAGE_CODE);

這里採用startActivityForResult來做跳轉,此處的IMAGE_CODE實質是0為一個依據,可以寫其他的值,但一定要>=0

然後重寫onActivityResult用於接收剛剛得到的數據

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm); } catch (IOException e) {
e.printStackTrace(); }
}

補充{
ContentProvider-----數據提供給第三方應用程序使用時使用
因為在Android系統裡面,資料庫是私有的。一般情況下外部應用程序是沒有許可權讀取其他應用程序的數據。如果你想公開你自己的數據,你有兩個選擇:你可以創建你自己的內容提供器(一個ContentProvider子類)或者你可以給已有的提供器添加數據-如果存在一個控制同樣類型數據的內容提供器且你擁有寫的許可權
}
這里是創建一個新的內容提供器,然後在Activity當中通過getContentResolver()可以得到當前應用的 ContentResolver實例

if (requestCode == IMAGE_CODE) {
resultCode為回傳的標記這句話是在確認是否回傳的是你所需要的;如果是就執行try;不然就執行catch (IOException e) {
e.printStackTrace();}先說這里當try語句中出現異常是時,會執行catch中的語句,IOException e也就是實例化Exception類型的對象。e是此對象引用名稱。然後e(引用)會自動調用Exception類中指定的方法,也就出現了e.printStackTrace() ;。printStackTrace()方法的意思是:在命令行列印異常信息在程序中出錯的位置及原因。
try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm);接收數據處理數據並顯示照片。
然後進行測試。


另附源碼
MainActivity:
package com.example.administrator.myapplication1;import android.graphics.BitmapFactory;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import java.io.IOException;import android.net.Uri;import android.os.Bundle;import android.provider.MediaStore;import android.app.Activity;import android.content.ContentResolver;import android.content.Intent;import android.graphics.Bitmap;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { private final String IMAGE_TYPE = "image/*"; private final int IMAGE_CODE = 0; private Button choose=null; private ImageView imgShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init();} private void init() { choose=(Button) findViewById(R.id.button1); imgShow=(ImageView) findViewById(R.id.imgShow); choose.setOnClickListener(listener); } private OnClickListener listener=new OnClickListener(){ @Override public void onClick(View v) {
setImage(); }

}; private void setImage() {
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); getAlbum.setType(IMAGE_TYPE); startActivityForResult(getAlbum, IMAGE_CODE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap bm = null; ContentResolver resolver = getContentResolver(); if (requestCode == IMAGE_CODE) { try {
Uri originalUri = data.getData(); bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); imgShow.setImageBitmap(bm); } catch (IOException e) {
e.printStackTrace(); }
}
}
}


layout:activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="選擇照相" android:layout_marginRight="190dp" android:layout_marginTop="8dp" android:paddingBottom="2dp" android:background="#aabbcc" /> <ImageView android:id="@+id/imgShow" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="15dip" /></LinearLayout>

⑹ android imageview獲取本地圖片的問題

從本地獲得的圖片不能以int的方式放在int數組里,可以放在String數組或者,Bitmap對象的list里。
需要時直接ImageView.setImageBitmap(BitmapList.get(i));

⑺ 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 非activity類獲取本地圖片資源

你的問題是不能找到view?然後view上就不能獲取圖片?應該說圖片還是要到Activity上顯示用的吧?

可以將Activity作為Context對象參數傳到你的類裡面,然後就可以用context.findviewbyid......
也可以用getApplicationContext(),。。。。。。
如果你的類沒有一個view,那隻能把圖片資源定義成一個int[]或list型的數據結構了,。。。

⑼ android如何獲取imageview上圖片在本地的地址包括名字新手著急用.....

Bitmap bm = BitmapFactory.decodeFile(FilePath);//FilePath為圖片路徑及名字
ImageView.setImageBitmap(bm);

⑽ android開發如何執行下載圖片到指定目錄里,然後通過imageview去讀取該圖片。

1、首先你有一個保存圖片的路徑 filePath

還有一個現在圖片的鏈接 url

StringfilePath="....";
Stringurl="....";
bytes[]b=newbytes[1024];
Filefile=newFile(filePath);
FileOutputStreamfs=newFileOutputStream(file);
InputStreamin=newURL(url);
while(in.read(b)){
fs.wirte(b);
}
Bitmapbitmap=BitmmapFactory.decodeStream(in);
imageView.setBitmapResource()

大概就是這樣詳細的你自己弄吧

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:593
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:888
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:581
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:765
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:684
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1013
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:255
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:114
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:806
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:713