Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android開發——從相冊中選擇圖片不裁剪

android開發——從相冊中選擇圖片不裁剪

編輯:關於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); 獲取照片絕對路徑 。

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved