編輯:關於Android編程
問題:
在郭神的第一行代碼中,第8章的從相冊中選擇圖片這塊,從相冊選一張裁剪後顯示到屏幕。但是運行後會發現從相冊選了圖片後,沒有彈出裁剪的界面,直接返回。
方案:
查找原因時,發現SD卡路徑下的output_image.jpg是一個0字節文件。所以
這張圖片沒有生成。然後我覺得是向系統發送選擇照片的意圖出了問題。我好奇的查看了下系統的圖庫應用(gallery)源碼的清單文件意圖過濾器這塊,果然有發現:
發現這裡用android.intent.action.PICK的action,可以選擇圖片或是視頻。而書裡是android.intent.action.GET_CONTENT。
修改後成功跳轉到裁剪界面。
再者一個問題,我用
Uri selectedImage = data.getData();//獲取系統返回的照片的Uri
輸出後發現這並不是一個絕對路徑。這對於我們設置到ImageVew上或上傳到網絡上等 是不正確的。
demo:
我這裡給出個從相冊中選擇圖片不裁剪的demo,告訴大家如何獲得絕對路徑,完美運行。
首先新建一個項目,編輯activity_main.xml 文件,在布局中添加一個按鈕用於從相冊中選擇照片,一個imageview。代碼如下所示:
然後修改 MainActivity 中的代碼,加入從相冊選擇照片的邏輯,代碼如下所示:
package com.example.selectfromgallery;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Button chooseFromAlbum;
private ImageView picImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
picImageView= (ImageView)findViewById(R.id.View);
chooseFromAlbum = (Button)findViewById(R.id.choose_from_album);
chooseFromAlbum.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
selectPicture();
}
});
}
/**
* 從相冊選擇照片(不裁切)
*/
private void selectPicture() {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setAction(Intent.ACTION_PICK);//Pick an item from the data
intent.setType(image/*);//從所有圖片中進行選擇
startActivityForResult(intent, 1);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode==RESULT_OK) {//從相冊選擇照片不裁切
try {
Uri selectedImage = data.getData(); //獲取系統返回的照片的Uri
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor =getContentResolver().query(selectedImage,
filePathColumn, null, null, null);//從系統表中查詢指定Uri對應的照片
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex); //獲取照片路徑
cursor.close();
Bitmap bitmap= BitmapFactory.decodeFile(picturePath);
picImageView.setImageBitmap(bitmap);
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
解析:
從 MainActivity可以發現 從相冊中選擇圖片這功能只有兩步:
第一步:向系統發送選擇照片的意圖。
/**
* 從相冊選擇照片(不裁切)
*/
private void selectPicture() {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setAction(Intent.ACTION_PICK);//Pick an item from the data
intent.setType(image/*);//從所有圖片中進行選擇
startActivityForResult(intent, 1);
}
第二步:處理onActivityResult系統返回的結果。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode==RESULT_OK) {//從相冊選擇照片不裁切
try {
Uri selectedImage = data.getData(); //獲取系統返回的照片的Uri
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor =getContentResolver().query(selectedImage,
filePathColumn, null, null, null);//從系統表中查詢指定Uri對應的照片
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex); //獲取照片路徑
cursor.close();
Bitmap bitmap= BitmapFactory.decodeFile(picturePath);
picImageView.setImageBitmap(bitmap);
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
系統會返回一個選擇照片的Uri,Uri selectedImage = data.getData();然後定義String[] filePathColumn = { MediaStore.Images.Media.DATA }; 在filePathColumn 中查找指定Uri路徑。通過cursor.getString(columnIndex); 獲取照片絕對路徑 。
在學完了Android的基礎之後,我開始嘗試著寫一些小項目練練手,同時進一步鞏固自己的基礎知識,而我選的的第一個項目就是做一個簡單的人人對戰的五子棋小游戲。首先,我們要新
昨天給大家粗略的介紹了一下我那個簡單的項目:Android之基於XMPP協議即時通訊軟件(一) 從今天開始,就詳細展開的介紹設計思路,一是給自己做個總結,二
說起Android 自定義View,網上的博客、視頻很多。鴻洋的博客和視頻還是很值得推薦的。本文打算結合Sdk源碼,來講解如何自定義一個View。本文結合TextView
引言最近在研究Android的變形,Android的2D變形(包括縮放,扭曲,平移,旋轉等)可以通過Matrix來實現,3D變形可以通過Camera來實現。接下來就將我這