zoukankan      html  css  js  c++  java
  • 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。代码例如以下所看到的:

    <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

  • 相关阅读:
    TypeScript Handbook 2——接口1(翻译)
    TypeScript Handbook 1——基本类型(翻译)
    [转]AJAX 跨源 HTTP 请求
    [转] Delphi Socket Architecture
    handsontable的一种js继承方式
    test11
    test
    javascript代码风格
    maven创建web项目
    Oracle 11g R2 for Win10(64位)的安装注意点
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7355880.html
Copyright © 2011-2022 走看看