Android实战简易教程<二十八>(Uri转String型实例)

来源:互联网 发布:层次聚类 python 编辑:程序博客网 时间:2024/06/07 07:10

接上一篇文章,我们可以轻易的获取所选图片的uri,那么我们考虑如何将获取的uri转换成String型的地址呢?

接下来我们通过实例来研究,布局文件和上篇(二十七枪)一致,我们就不再列出,直接看MainActivity.java:

[java] view plaincopy
  1. package com.example.userphoto;  
  2.   
  3. import java.io.File;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.database.Cursor;  
  8. import android.graphics.Bitmap;  
  9. import android.graphics.drawable.BitmapDrawable;  
  10. import android.graphics.drawable.Drawable;  
  11. import android.net.Uri;  
  12. import android.os.Bundle;  
  13. import android.os.Environment;  
  14. import android.provider.MediaStore;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18. import android.widget.ImageView;  
  19. import android.widget.Toast;  
  20. import cn.bmob.v3.Bmob;  
  21. import cn.bmob.v3.datatype.BmobFile;  
  22. import cn.bmob.v3.listener.UploadFileListener;  
  23.   
  24. public class MainActivity extends Activity implements OnClickListener {  
  25.     private static final int IMAGE_REQUEST_CODE = 0;  
  26.     private static final int CAMERA_REQUEST_CODE = 1;  
  27.     private static final int RESIZE_REQUEST_CODE = 2;  
  28.   
  29.     private static final String IMAGE_FILE_NAME = "header.jpg";  
  30.   
  31.     private ImageView mImageHeader;  
  32.   
  33.     @Override  
  34.     protected void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.         setContentView(R.layout.activity_main);  
  37.   
  38.         Bmob.initialize(this"8f3ffb2658d8a3366a70a0b0ca0b71b2");//初始化Bmob  
  39.         setupViews();  
  40.     }  
  41.   
  42.     private void setupViews() {  
  43.         mImageHeader = (ImageView) findViewById(R.id.image_header);  
  44.         final Button selectBtn1 = (Button) findViewById(R.id.btn_selectimage);  
  45.         final Button selectBtn2 = (Button) findViewById(R.id.btn_takephoto);  
  46.         selectBtn1.setOnClickListener(this);  
  47.         selectBtn2.setOnClickListener(this);  
  48.     }  
  49.   
  50.     @Override  
  51.     public void onClick(View v) {  
  52.         switch (v.getId()) {  
  53.         case R.id.btn_selectimage:  
  54.             Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);  
  55.             galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);  
  56.             galleryIntent.setType("image/*");//图片  
  57.             startActivityForResult(galleryIntent, IMAGE_REQUEST_CODE);  
  58.             break;  
  59.         case R.id.btn_takephoto:  
  60.             if (isSdcardExisting()) {  
  61.                 Intent cameraIntent = new Intent(  
  62.                         "android.media.action.IMAGE_CAPTURE");//拍照  
  63.                 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());  
  64.                 cameraIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);  
  65.                 startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);  
  66.             } else {  
  67.                 Toast.makeText(v.getContext(), "请插入sd卡", Toast.LENGTH_LONG)  
  68.                         .show();  
  69.             }  
  70.             break;  
  71.         }  
  72.     }  
  73.   
  74.     @Override  
  75.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  76.         if (resultCode != RESULT_OK) {  
  77.             return;  
  78.         } else {  
  79.             switch (requestCode) {  
  80.             case IMAGE_REQUEST_CODE:  
  81.                 Uri originalUri=data.getData();//获取图片uri  
  82.                 resizeImage(originalUri);  
  83.                 //下面方法将获取的uri转为String类型哦!  
  84.                 String []imgs={MediaStore.Images.Media.DATA};//将图片URI转换成存储路径    
  85.                 Cursor cursor=this.managedQuery(originalUri, imgs, nullnullnull);    
  86.                 int index=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);    
  87.                 cursor.moveToFirst();    
  88.                 String img_url=cursor.getString(index);    
  89.                 showToast(img_url);  
  90.                 break;  
  91.             case CAMERA_REQUEST_CODE:  
  92.                 if (isSdcardExisting()) {  
  93.                     resizeImage(getImageUri());  
  94.                       
  95.                     /*// 上传图片  
  96.                     String imgpath = getImageUri();  
  97.                     final BmobFile icon = new BmobFile(new File(imgpath));  
  98.                     icon.upload(thisnew UploadFileListener() {  
  99.                           
  100.                         @Override  
  101.                         public void onSuccess() {  
  102.                             // TODO Auto-generated method stub  
  103.                             Person person = new Person();  
  104.                             person.setIcon(icon);  
  105.                             person.save(MainActivity.this);  
  106.                             showToast("图片上传成功");  
  107.                         }  
  108.                           
  109.                         @Override  
  110.                         public void onProgress(Integer arg0) {  
  111.                             // TODO Auto-generated method stub  
  112.                               
  113.                         }  
  114.                           
  115.                         @Override  
  116.                         public void onFailure(int arg0, String arg1) {  
  117.                             // TODO Auto-generated method stub  
  118.                             showToast("图片上传失败:"+arg1);  
  119.                         }  
  120.                     });*/  
  121.                 } else {  
  122.                     Toast.makeText(MainActivity.this"未找到存储卡,无法存储照片!",  
  123.                             Toast.LENGTH_LONG).show();  
  124.                 }  
  125.                 break;  
  126.   
  127.             case RESIZE_REQUEST_CODE:  
  128.                 if (data != null) {  
  129.                     showResizeImage(data);  
  130.                 }  
  131.                 break;  
  132.             }  
  133.         }  
  134.   
  135.         super.onActivityResult(requestCode, resultCode, data);  
  136.     }  
  137.     private void showToast(String msg){  
  138.         Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();  
  139.     }  
  140.   
  141.     private boolean isSdcardExisting() {//判断SD卡是否存在  
  142.         final String state = Environment.getExternalStorageState();  
  143.         if (state.equals(Environment.MEDIA_MOUNTED)) {  
  144.             return true;  
  145.         } else {  
  146.             return false;  
  147.         }  
  148.     }  
  149.   
  150.     public void resizeImage(Uri uri) {//重塑图片大小  
  151.         Intent intent = new Intent("com.android.camera.action.CROP");  
  152.         intent.setDataAndType(uri, "image/*");  
  153.         intent.putExtra("crop""true");//可以裁剪  
  154.         intent.putExtra("aspectX"1);  
  155.         intent.putExtra("aspectY"1);  
  156.         intent.putExtra("outputX"150);  
  157.         intent.putExtra("outputY"150);  
  158.         intent.putExtra("return-data"true);  
  159.         startActivityForResult(intent, RESIZE_REQUEST_CODE);  
  160.     }  
  161.   
  162.     private void showResizeImage(Intent data) {//显示图片  
  163.         Bundle extras = data.getExtras();  
  164.         if (extras != null) {  
  165.             Bitmap photo = extras.getParcelable("data");  
  166.             Drawable drawable = new BitmapDrawable(photo);  
  167.             mImageHeader.setImageDrawable(drawable);  
  168.         }  
  169.     }  
  170.   
  171.     private Uri getImageUri() {//获取路径  
  172.         return Uri.fromFile(new File(Environment.getExternalStorageDirectory(),  
  173.                 IMAGE_FILE_NAME));  
  174.     }  
  175. }  

将方法单列出来即:

[java] view plaincopy
  1.                             Uri originalUri=data.getData();//获取图片uri  
  2. resizeImage(originalUri);  
  3. //下面方法将获取的uri转为String类型哦!  
  4. String []imgs={MediaStore.Images.Media.DATA};//将图片URI转换成存储路径    
  5. Cursor cursor=this.managedQuery(originalUri, imgs, nullnullnull);    
  6. int index=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);    
  7. cursor.moveToFirst();    
  8. String img_url=cursor.getString(index);    
  9. showToast(img_url);  

运行实例会出现如下错误:


不懂英文的也大概能看懂,提示权限不足,我们添加如下权限:


运行实例,顺利通过:

0 0