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。代码如下所示:

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" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="相冊" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

/>

然后修改 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); 获取照片绝对路径 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值