app如何更換使用者頭像資訊呢 不妨這樣做
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
對於現在的手機應用而言,要想獲得更多的人的使用,就需要給使用者更多的自由功能才行,這也是基於使用者體驗開發軟體的核心思想,一切以使用者為中心,想使用者之所想,做使用者之所需。今天我就來談一談剛學到的一個關於設定使用者頭像的小技巧。
可行性分析
要想實現設定自定義的頭像功能,我們通常來說會有兩種選擇,那就是拍照或者從手機相簿裡面獲取。今天就來講一講,這兩種方式實現的細節的地方。
- 首先是拍照實現:原理上將,最簡單的實現就是呼叫系統自帶的照相機。這樣最為省事嘛。當然了,您也可以通過使用自己開發的一個照相應用來實現這一功能(可以參考我之前的這篇文章做自己的安卓拍照應用,其實很簡單)。但是這裡並不建議您這樣做,畢竟重複造輪子是沒有任何意義的嘛,更何況自己實現的應用還不一定有人家系統自帶的好使呢。
- 然後是從本地的相簿中選取一張圖片來作為結果使用。這樣最為方便,因為大部分的使用者會使用相簿中的圖片滴。但是這種方式靈活性較差,因為使用者很有可能只想上傳自己的自拍照片。這樣的話,我們就需要實現上面的那個功能了。
我的Demo
首先是佈局檔案,這裡僅僅是兩個按鈕(分別用於實現上面的兩種方式),和一個用於顯示圖層的ImageView。僅此而已。所以就不在此列出程式碼了。
然後是Java程式碼,這裡就貼出來吧,方便大家瀏覽。
package com.example.intenttest;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import android.app.Activity;import android.content.ContentResolver;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends Activity { private Button btn_capture; private Button btn_getPicture; private ImageView imageView; public void init() { btn_capture = (Button) findViewById(R.id.btn_capture); btn_getPicture = (Button) findViewById(R.id.btn_choose); imageView = (ImageView) findViewById(R.id.imageview); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } /** * 呼叫系統的拍照 * @param view */ public void beginCapture(View view) { Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1001); } /** * 從手機的本地相簿中選擇一張圖片作為頭像資源 * @param view */ public void getPicture(View view) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("crop", true); intent.putExtra("return-data", true); startActivityForResult(intent, 1002); } /** * 將上面的Intent中的返回的結果分別顯示到相關的ImageView上 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //呼叫系統相機,獲得照片資源,選要注意的是這裡的data 是存在於記憶體中的 if (requestCode == 1001 && resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data"); imageView.setImageBitmap(bitmap); } //使用相簿資源,以ContentProvider的方式來實現 if (requestCode == 1002 && resultCode == RESULT_OK) { InputStream is = null; try { Uri uri = data.getData(); ContentResolver resolver = getContentResolver(); is = resolver.openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); imageView.setImageBitmap(bitmap); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(is!=null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } is = null; } } } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
程式碼實現原理詳解
首先是第一種方式,我們可以看到如下核心程式碼:
Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1001);
- 1
- 2
- 3
以及:
//呼叫系統相機,獲得照片資源,選要注意的是這裡的data 是存在於記憶體中的 if (requestCode == 1001 && resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data"); imageView.setImageBitmap(bitmap); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
這樣做的核心就在於那個Intent了,其指定了是從android.provider.MediaStore.ACTION_IMAGE_CAPTURE,這樣就可以在onActivityResult方法中將處理的結果通過轉換成一個位圖的方式設定到ImageView上,實現使用者頭像設定。
然後是第二種方式,
/** * 從手機的本地相簿中選擇一張圖片作為頭像資源 * @param view */ public void getPicture(View view) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("crop", true); intent.putExtra("return-data", true); startActivityForResult(intent, 1002); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
//使用相簿資源,以ContentProvider的方式來實現 if (requestCode == 1002 && resultCode == RESULT_OK) { InputStream is = null; try { Uri uri = data.getData(); ContentResolver resolver = getContentResolver(); is = resolver.openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); imageView.setImageBitmap(bitmap); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(is!=null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } is = null; } } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
這裡是藉助於ContentProvider,來獲取共享的資源。藉助於getContentProvider()方法,然後得到一個目標圖片的輸入流,轉換成點陣圖,最後設定到我們的ImageView上,這樣同樣可以實現我們的頭像設定功能。
總結
今天的這個小技巧,雖然很簡單,但是實用性還是很高的。我們在日常的額開發過程中遇到的額可能不是簡單的直接在本地實現頭像的額更換,但是我們可以再一個Service中來實現上傳的功能,藉助於流的形式,原理上市相似的。
對於程式碼,如果您發現了一些問題,歡迎批評指正。