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

來源:互聯網
上載者:User

android開發——從相簿中選擇圖片不裁剪,
轉載請註明出處:http://blog.csdn.net/zhoubin1992/article/details/46864777

問題:
在郭神的第一行代碼中,第8章的從相簿中選擇圖片這塊,從相簿選一張裁剪後顯示到螢幕。但是運行後會發現從相簿選了圖片後,沒有彈出裁剪的介面,直接返回。

方案:

尋找原因時,發現SD卡路徑下的output_image.jpg是一個0位元組檔案。所以
這張圖片沒有產生。然後我覺得是向系統發送選擇照片的意圖出了問題。我好奇的查看了下系統的圖庫應用(gallery)源碼的資訊清單檔意圖過濾器這塊,果然有發現:

<intent-filter>                  <action android:name="android.intent.action.PICK" />                  <category android:name="android.intent.category.DEFAULT" />                  <data android:mimeType="image/*" />                  <data android:mimeType="video/*" />              </intent-filter>

發現這裡用android.intent.action.PICK的action,可以選擇圖片或是視頻。而書裡是android.intent.action.GET_CONTENT。
修改後成功跳轉到裁剪介面。
再者一個問題,我用
Uri selectedImage = data.getData();//擷取系統返回的照片的Uri
輸出後發現這並不是一個絕對路徑。這對於我們設定到ImageVew上或上傳到網路上等 是不正確的。

demo:
我這裡給出個從相簿中選擇圖片不裁剪的demo,告訴大家如何獲得絕對路徑,完美運行。
首先建立一個項目,編輯activity_main.xml 檔案,在布局中添加一個按鈕用於從相簿中選擇照片,一個imageview。代碼如下所示:

        " data-snippet-id="ext.2f9e1a0d919a8d10c752c253a8a5827c" data-snippet-saved="false" data-codota-status="done"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:orientation="vertical"    tools:context="com.example.selectfromgallery.MainActivity" >    <Button    android:id="@+id/choose_from_album"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="相冊" />    <ImageView        android:id="@+id/View"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"          /></LinearLayout>

然後修改 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); 擷取照片絕對路徑 。

demo下載:
http://download.csdn.net/detail/zhoubin1992/8895633

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.