热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android开发分享如何从图库(SD卡)为我的应用程序select一个图像?

这个问题最初是要求为Android1.6

这个问题最初是要求为Android 1.6。

我正在处理我的应用程序中的照片选项。

我在我的活动中有一个button和一个ImageView。 当我点击button时,它会redirect到画廊,我将能够select一个图像。 所选图像将出现在我的ImageView中。

    近5年后更新了答案:

    原始答案中的代码不再可靠地工作,因为来自各种来源的图像有时会返回不同的内容URI,即content://而不是file:// 。 一个更好的解决scheme是简单地使用context.getContentResolver().openInputStream(intent.getData()) ,因为这将返回一个InputStream,你可以在你select的时候处理。

    例如, BitmapFactory.decodeStream()在这种情况下可以很好地工作,因为您也可以使用Options和inSampleSize字段来下采样大图像并避免内存问题。

    但是,Google云端硬盘会将URI返回给尚未实际下载的图片。 因此,您需要在后台线程上执行getContentResolver()代码。


    原始答案:

    其他答案解释了如何发送意图,但他们没有解释如何处理这个答复。 以下是关于如何做到的一些示例代码:

     protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); switch(requestCode) { case REQ_CODE_PICK_IMAGE: if(resultCode == RESULT_OK){ Uri selectedImage = imageReturnedIntent.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query( selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); cursor.close(); Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath); } } } 

    在这之后,您已经将所选的图像存储在“yourSelectedImage”中,以执行任何您想要的操作。 这段代码通过获取ContentResolver数据库中图像的位置来工作,但是它本身是不够的。 每个图像都有大约18列的信息,从文件path到'最后修改date'到拍摄照片的GPS坐标,尽pipe很多字段没有被实际使用。

    为了节省时间,因为您实际上不需要其他字段,光标search使用filter完成。 该filter通过指定所需列的名称MediaStore.Images.Media.DATA(这是path),然后将该string[]指定给游标查询来工作。 游标查询返回的path,但你不知道它是哪个列,直到你使用columnIndex代码。 这只是根据名称获取列的编号,在过滤过程中使用了相同的名称。 一旦你得到了,你终于能够解码图像成最后一行我给的代码位图。

     private static final int SELECT_PHOTO = 100; 

    开始意图

     Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, SELECT_PHOTO); 

    处理结果

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); switch(requestCode) { case SELECT_PHOTO: if(resultCode == RESULT_OK){ Uri selectedImage = imageReturnedIntent.getData(); InputStream imageStream = getContentResolver().openInputStream(selectedImage); Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream); } } } 

    或者,您也可以对图像进行缩减采样以避免OutOfMemory错误。

     private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o); // The new size we want to scale to final int REQUIRED_SIZE = 140; // Find the correct scale value. It should be the power of 2. int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp / 2  

    你必须开始画廊意图的结果。

     Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, ACTIVITY_SELECT_IMAGE); 

    然后在onActivityForResult ,调用intent.getData()来获取图像的Uri。 然后,您需要从ContentProvider获取图像。

    这是一个经过testing的图像和video代码。它将适用于所有19以下和19以上的API。

    图片:

     if (Build.VERSION.SDK_INT <= 19) { Intent i = new Intent(); i.setType("image/*"); i.setAction(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(i, 10); } else if (Build.VERSION.SDK_INT > 19) { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 10); } 

    video:

     if (Build.VERSION.SDK_INT <= 19) { Intent i = new Intent(); i.setType("video/*"); i.setAction(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(i, 20); } else if (Build.VERSION.SDK_INT > 19) { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 20); } 

      @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == 10) { Uri selectedImageUri = data.getData(); String selectedImagePath = getRealPathFromURI(selectedImageUri); } else if (requestCode == 20) { Uri selectedVideoUri = data.getData(); String selectedVideoPath = getRealPathFromURI(selectedVideoUri); } } } public String getRealPathFromURI(Uri uri) { if (uri == null) { return null; } String[] projection = {MediaStore.Images.Media.DATA}; Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } return uri.getPath(); } 

    这样做启animation廊,并允许用户select一个图像:

     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, IMAGE_PICK); 

    然后在你的onActivityResult()使用返回的图像的URI来设置ImageView上的图像。

     public class EMView extends Activity { ImageView img,img1; int column_index; Intent intent=null; // Declare our Views, so we can access them later String logo,imagePath,Logo; Cursor cursor; //YOU CAN EDIT THIS TO WHATEVER YOU WANT private static final int SELECT_PICTURE = 1; String selectedImagePath; //ADDED String filemanagerstring; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); img= (ImageView)findViewById(R.id.gimg1); ((Button) findViewById(R.id.Button01)) .setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // in onCreate or any event where your want the user to // select a file Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); } }); } //UPDATED @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); //OI FILE Manager filemanagerstring = selectedImageUri.getPath(); //MEDIA GALLERY selectedImagePath = getPath(selectedImageUri); img.setImageURI(selectedImageUri); imagePath.getBytes(); TextView txt = (TextView)findViewById(R.id.title); txt.setText(imagePath.toString()); Bitmap bm = BitmapFactory.decodeFile(imagePath); // img1.setImageBitmap(bm); } } } //UPDATED! public String getPath(Uri uri) { String[] projection = { MediaColumns.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); column_index = cursor .getColumnIndexOrThrow(MediaColumns.DATA); cursor.moveToFirst(); imagePath = cursor.getString(column_index); return cursor.getString(column_index); } } 

     public class BrowsePictureActivity extends Activity { private static final int SELECT_PICTURE = 1; private String selectedImagePath; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button) findViewById(R.id.Button01)) .setOnClickListener(new OnClickListener() { public void onClick(View arg0) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); } }); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); selectedImagePath = getPath(selectedImageUri); } } } public String getPath(Uri uri) { if( uri == null ) { return null; } // this will only work for images selected from gallery String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); if( cursor != null ){ int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } return uri.getPath(); } } 

    由于某些原因, onActivityResult()所有答案都会尝试对接收到的Uri进行后期处理,例如获取图像的实际path,然后使用BitmapFactory.decodeFile(path)获取Bitmap

    这一步是不必要的。 ImageView类有一个名为setImageURI(uri) 。 把你的尿通过它,你应该完成。

     Uri imageUri = data.getData(); imageView.setImageURI(imageUri); 

    对于一个完整的工作例子,你可以看看这里: http : //androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html

    PS:
    在一个单独的variables中获取Bitmap是有意义的,因为要加载的图像太大而不能放入内存,并且缩小操作对于防止OurOfMemoryError是必要的,就像@siamii答案中所示。

    调用chooseImage方法like-

     public void chooseImage(ImageView v) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, SELECT_PHOTO); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, imageReturnedIntent); if(imageReturnedIntent != null) { Uri selectedImage = imageReturnedIntent.getData(); switch(requestCode) { case SELECT_PHOTO: if(resultCode == RESULT_OK) { Bitmap datifoto = null; temp.setImageBitmap(null); Uri picUri = null; picUri = imageReturnedIntent.getData();//<- get Uri here from data intent if(picUri !=null){ try { datifoto = android.provider.MediaStore.Images.Media.getBitmap(this.getContentResolver(), picUri); temp.setImageBitmap(datifoto); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } catch (OutOfMemoryError e) { Toast.makeText(getBaseContext(), "Image is too large. choose other", Toast.LENGTH_LONG).show(); } } } break; } } else { //Toast.makeText(getBaseContext(), "data null", Toast.LENGTH_SHORT).show(); } } 

     #initialize in main activity path = Environment.getExternalStorageDirectory() + "http://img.dovov.commake_machine_example.jpg"; # ImageView image=(ImageView)findViewById(R.id.image); //--------------------------------------------------|| public void FromCamera(View) { Log.i("camera", "startCameraActivity()"); File file = new File(path); Uri outputFileUri = Uri.fromFile(file); Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, 1); } public void FromCard() { Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, 2); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 2 && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); bitmap = BitmapFactory.decodeFile(picturePath); image.setImageBitmap(bitmap); if (bitmap != null) { ImageView rotate = (ImageView) findViewById(R.id.rotate); } } else { Log.i("SonaSys", "resultCode: " + resultCode); switch (resultCode) { case 0: Log.i("SonaSys", "User cancelled"); break; case -1: onPhotoTaken(); break; } } } protected void onPhotoTaken() { // Log message Log.i("SonaSys", "onPhotoTaken"); taken = true; imgCapFlag = true; BitmapFactory.Options optiOns= new BitmapFactory.Options(); options.inSampleSize = 4; bitmap = BitmapFactory.decodeFile(path, options); image.setImageBitmap(bitmap); } 

      以上就是android开发分享如何从图库(SD卡)为我的应用程序select一个图像?相关内容,想了解更多android开发(异常处理)及android游戏开发关注(编程笔记)。


      推荐阅读
      • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
      • 本文探讨了在PHP中实现MySQL分页查询功能的优化方法与实际应用。通过详细分析分页查询的常见问题,提出了多种优化策略,包括使用索引、减少查询字段、合理设置缓存等。文章还提供了一个具体的示例,展示了如何通过优化模型加载和分页参数设置,显著提升查询性能和用户体验。 ... [详细]
      • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
        在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
      • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
      • Spring – Bean Life Cycle
        Spring – Bean Life Cycle ... [详细]
      • 解决Only fullscreen opaque activities can request orientation错误的方法
        本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
      • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
      • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
      • DVWA学习笔记系列:深入理解CSRF攻击机制
        DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
      • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
        本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
      • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
      • Spring框架中枚举参数的正确使用方法与技巧
        本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
      • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
      • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
      • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
        在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
      author-avatar
      mobiledu2502895137
      这个家伙很懒,什么也没留下!
      PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
      Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有