android获得手机照片,摄像,拍照,录音等功能并将其转为字符串

  1. 今天在项目中,需要获得手机本地相册中的照片路径,拍照并获得拍照后的路径,摄像并获得摄像后的路径,录音并获得录音后的路径,并将相应文件转为string格式以便利用json上传至服务端。
  2. 参考了网上的一些材料,在这里个人觉得比较好的一个资料是:http://www.oschina.net/code/snippet_163910_6069
  3. 在这里做个笔记,也希望能对大家有一点帮助。
  • 第一步:布局文件,对于布局文件我总是做不好,希望大家凑合着
    View Code
      1 <?xml version="1.0" encoding="utf-8"?>
    
      2 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    
      3     android:layout_width="match_parent"
    
      4     android:layout_height="match_parent"
    
      5     android:orientation="vertical"
    
      6     android:scrollbars="vertical" >
    
      7 
    
      8     <LinearLayout
    
      9         android:layout_width="match_parent"
    
     10         android:layout_height="match_parent"
    
     11         android:orientation="vertical" >
    
     12 
    
     13         <LinearLayout
    
     14             android:layout_width="fill_parent"
    
     15             android:layout_height="wrap_content"
    
     16             android:orientation="vertical" >
    
     17 
    
     18             <!-- 用户名 -->
    
     19 
    
     20             <LinearLayout
    
     21                 android:layout_width="fill_parent"
    
     22                 android:layout_height="wrap_content"
    
     23                 android:layout_marginBottom="10px"
    
     24                 android:layout_marginTop="160px"
    
     25                 android:orientation="horizontal" >
    
     26 
    
     27                 <TextView
    
     28                     android:layout_width="wrap_content"
    
     29                     android:layout_height="wrap_content"
    
     30                     android:text="用  户  名" />
    
     31 
    
     32                 <EditText
    
     33                     android:id="@+id/username"
    
     34                     android:layout_width="fill_parent"
    
     35                     android:layout_height="wrap_content"
    
     36                     android:layout_marginLeft="5px" />
    
     37             </LinearLayout>
    
     38 
    
     39             <!-- 身份证 -->
    
     40 
    
     41             <LinearLayout
    
     42                 android:layout_width="fill_parent"
    
     43                 android:layout_height="wrap_content"
    
     44                 android:layout_marginBottom="10px"
    
     45                 android:orientation="horizontal" >
    
     46 
    
     47                 <TextView
    
     48                     android:layout_width="wrap_content"
    
     49                     android:layout_height="wrap_content"
    
     50                     android:text="身  份  证" />
    
     51 
    
     52                 <EditText
    
     53                     android:id="@+id/identifi"
    
     54                     android:layout_width="fill_parent"
    
     55                     android:layout_height="wrap_content"
    
     56                     android:layout_marginLeft="5px" />
    
     57             </LinearLayout>
    
     58 
    
     59             <LinearLayout
    
     60                 android:layout_width="fill_parent"
    
     61                 android:layout_height="wrap_content"
    
     62                 android:orientation="horizontal" >
    
     63 
    
     64                 <TextView
    
     65                     android:layout_width="wrap_content"
    
     66                     android:layout_height="wrap_content"
    
     67                     android:text="信息" />
    
     68 
    
     69                 <EditText
    
     70                     android:id="@+id/alarminfo"
    
     71                     android:layout_width="fill_parent"
    
     72                     android:layout_height="wrap_content"
    
     73                     android:layout_marginLeft="5px"
    
     74                     android:lines="6" />
    
     75             </LinearLayout>
    
     76         </LinearLayout>
    
     77 
    
     78         <LinearLayout
    
     79             android:layout_width="fill_parent"
    
     80             android:layout_height="wrap_content"
    
     81             android:orientation="horizontal" >
    
     82 
    
     83             <Button
    
     84                 android:id="@+id/picbutton"
    
     85                 android:layout_width="wrap_content"
    
     86                 android:layout_height="wrap_content"
    
     87                 android:text="本地上传" />
    
     88 
    
     89             <EditText
    
     90                 android:id="@+id/pictext"
    
     91                 android:layout_width="fill_parent"
    
     92                 android:layout_height="wrap_content"
    
     93                 android:layout_marginLeft="5px" />
    
     94         </LinearLayout>
    
     95 
    
     96         <LinearLayout
    
     97             android:layout_width="fill_parent"
    
     98             android:layout_height="wrap_content"
    
     99             android:orientation="horizontal" >
    
    100 
    
    101             <Button
    
    102                 android:id="@+id/photobutton"
    
    103                 android:layout_width="wrap_content"
    
    104                 android:layout_height="wrap_content"
    
    105                 android:text="拍照上传" />
    
    106 
    
    107             <EditText
    
    108                 android:id="@+id/phototext"
    
    109                 android:layout_width="fill_parent"
    
    110                 android:layout_height="wrap_content"
    
    111                 android:layout_marginLeft="5px" />
    
    112         </LinearLayout>
    
    113 
    
    114         <LinearLayout
    
    115             android:layout_width="fill_parent"
    
    116             android:layout_height="wrap_content"
    
    117             android:orientation="horizontal" >
    
    118 
    
    119             <Button
    
    120                 android:id="@+id/mp3buttonbegin"
    
    121                 android:layout_width="wrap_content"
    
    122                 android:layout_height="wrap_content"
    
    123                 android:text="录音开始" />
    
    124 
    
    125             <Button
    
    126                 android:id="@+id/vediobutton"
    
    127                 android:layout_width="wrap_content"
    
    128                 android:layout_height="wrap_content"
    
    129                 android:text="视频录制" />
    
    130 
    
    131             <Button
    
    132                 android:id="@+id/submit"
    
    133                 android:layout_width="wrap_content"
    
    134                 android:layout_height="wrap_content"
    
    135                 android:layout_marginLeft="90px"
    
    136                 android:layout_marginRight="5px"
    
    137                 android:text="提  交" />
    
    138         </LinearLayout>
    
    139     </LinearLayout>
    
    140 
    
    141 </ScrollView>
  • 第二步:主界面Activity
    View Code
      1 public class MppspPhoneAlarmAct extends ActivityGroup
    
      2 {
    
      3 
    
      4     /* 用来标识请求照相功能的activity */
    
      5     private static final int CAMERA_WITH_DATA = 1001;
    
      6     /* 用来标识请求gallery的activity */
    
      7     private static final int PHOTO_PICKED_WITH_DATA = 1002;
    
      8     // 用来标示请求录音功能的activity
    
      9     private static final int RESULT_CAPTURE_RECORDER_SOUND = 1003;
    
     10     // 用来标示请求视频录制功能的activity
    
     11     private static final int REQUEST_CODE_TAKE_VIDEO = 1004;
    
     12     // 手机图片路径
    
     13     private String imagePath = "";
    
     14     // 拍照路径
    
     15     private String strImgPath = "";
    
     16     // 获得用户名的文本框
    
     17     private EditText mNameText = null;
    
     18     // 获得省份证的文本框
    
     19     private EditText mIdText = null;
    
     20     // 获得信息的文本框
    
     21     private EditText mAlarmInfoText = null;
    
     22     // 文件路径文本框
    
     23     private EditText mPictext = null;
    
     24     // 多媒体设备
    
     25     private MediaRecorder mRecod;
    
     26     // 录音文件的路径
    
     27     private String strRecorderPath = "";
    
     28     // 摄制视频文件的路径
    
     29     private String strVideoPath = "";
    
     30 
    
     31     @Override
    
     32     protected void onCreate(Bundle savedInstanceState)
    
     33     {
    
     34         super.onCreate(savedInstanceState);
    
     35         this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    
     36         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    
     37                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
     38         this.setContentView(R.layout.mppsp_phonealarm);
    
     39         mNameText = (EditText) this.findViewById(R.id.username);
    
     40         mIdText = (EditText) this.findViewById(R.id.identifi);
    
     41         mAlarmInfoText = (EditText) this.findViewById(R.id.alarminfo);
    
     42         // 手机图片
    
     43         mPictext = (EditText) findViewById(R.id.pictext);
    
     44         // 上传材料的按钮
    
     45         Button mpicbutton = (Button) findViewById(R.id.picbutton);
    
     46         mpicbutton.setOnClickListener(new View.OnClickListener()
    
     47         {
    
     48 
    
     49             public void onClick(View v)
    
     50             {
    
     51                 Intent intent = new Intent();
    
     52                 /* 开启Pictures画面Type设定为image */
    
     53                 intent.setType("image/*");
    
     54                 /* 使用Intent.ACTION_GET_CONTENT这个Action */
    
     55                 intent.setAction(Intent.ACTION_GET_CONTENT);
    
     56                 /* 取得相片后返回本画面 */
    
     57                 startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);
    
     58             }
    
     59         });
    
     60         // 拍照按钮
    
     61         Button mPhotobutton = (Button) findViewById(R.id.photobutton);
    
     62         // 视频摄制按钮
    
     63         Button mVediobutton = (Button) findViewById(R.id.vediobutton);
    
     64         // 注册监听事件
    
     65         mPhotobutton.setOnClickListener(new View.OnClickListener()
    
     66         {
    
     67 
    
     68             public void onClick(View v)
    
     69             {
    
     70                 Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    
     71                 // 存放照片的文件夹
    
     72                 strImgPath = Environment.getExternalStorageDirectory().toString() + "/media/";
    
     73                 // 照片命名
    
     74                 String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";
    
     75                 File out = new File(strImgPath);
    
     76                 if (!out.exists())
    
     77                 {
    
     78                     // 创建文件夹
    
     79                     out.mkdirs();
    
     80                 }
    
     81                 out = new File(strImgPath, fileName);
    
     82                 // 该照片的绝对路径
    
     83                 strImgPath = strImgPath + fileName;
    
     84                 Uri uri = Uri.fromFile(out);
    
     85                 imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    
     86                 imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
    
     87                 startActivityForResult(imageCaptureIntent, CAMERA_WITH_DATA);
    
     88             }
    
     89         });
    
     90         // 录音开始按钮
    
     91         Button mBeginBtn = (Button) this.findViewById(R.id.mp3buttonbegin);
    
     92         // 录音结束按钮
    
     93         // 录音按钮事件监听
    
     94         mBeginBtn.setOnClickListener(new OnClickListener()
    
     95         {
    
     96 
    
     97             public void onClick(View v)
    
     98             {
    
     99                 String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
    
    100                 File dir = new File("/sdcard/arm/");
    
    101                 File mFile = null;
    
    102                 if (!dir.exists())
    
    103                 {
    
    104                     dir.mkdir();
    
    105                 }
    
    106                 // 设置输出路径
    
    107                 try
    
    108                 {
    
    109                     mFile = File.createTempFile(fileName + "-", ".mp3", dir);
    
    110                 }
    
    111                 catch (IOException e1)
    
    112                 {
    
    113                     e1.printStackTrace();
    
    114                 }
    
    115                 mRecod = new MediaRecorder();
    
    116                 // 设置音源
    
    117                 mRecod.setAudioSource(AudioSource.DEFAULT);
    
    118                 // 输出格式
    
    119                 mRecod.setOutputFormat(OutputFormat.DEFAULT);
    
    120                 mRecod.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    
    121                 try
    
    122                 {
    
    123                     Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    
    124                     intent.setType("audio/amr");
    
    125                     startActivityForResult(intent, RESULT_CAPTURE_RECORDER_SOUND);
    
    126                     mRecod.prepare();
    
    127                     mRecod.start();
    
    128                 }
    
    129                 catch (Exception e)
    
    130                 {
    
    131                     e.printStackTrace();
    
    132                 }
    
    133             }
    
    134         });
    
    135         // 视频录制按钮监听事件
    
    136         mVediobutton.setOnClickListener(new OnClickListener()
    
    137         {
    
    138 
    
    139             public void onClick(View v)
    
    140             {
    
    141                 Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    
    142                 intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
    
    143                 startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);
    
    144             }
    
    145         });
    
    146     }
    
    147     @Override
    
    148     protected void onActivityResult(int requestCode, int resultCode, Intent data)
    
    149     {
    
    150         switch (requestCode)
    
    151         {
    
    152         // 本地图片
    
    153             case PHOTO_PICKED_WITH_DATA:
    
    154                 Uri mUri = data.getData();
    
    155                 String[] projection = { MediaStore.Images.Media.DATA };
    
    156                 Cursor actualimagecursor = managedQuery(mUri, projection, null, null, null);
    
    157                 int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    
    158                 actualimagecursor.moveToFirst();
    
    159                 // 获取文件路径,方便上传文件等
    
    160                 imagePath = actualimagecursor.getString(actual_image_column_index);
    
    161                 mPictext.setText(imagePath);
    
    162                 break;
    
    163             // 照相机拍照
    
    164             case CAMERA_WITH_DATA:
    
    165                 EditText mphototext = (EditText) findViewById(R.id.phototext);
    
    166                 mphototext.setText(strImgPath);
    
    167                 break;
    
    168             // 录音
    
    169             case RESULT_CAPTURE_RECORDER_SOUND:
    
    170                 if (resultCode == RESULT_OK)
    
    171                 {
    
    172                     Uri uriRecorder = data.getData();
    
    173                     Cursor mCusor = this.getContentResolver().query(uriRecorder, null, null, null, null);
    
    174                     if (mCusor.moveToNext())
    
    175                     {
    
    176                         // _data:文件的绝对路径 ,_display_name:文件名
    
    177                         strRecorderPath = mCusor.getString(mCusor.getColumnIndex("_data"));
    
    178                         Toast.makeText(this, strRecorderPath, Toast.LENGTH_SHORT).show();
    
    179                     }
    
    180                 }
    
    181                 break;
    
    182             // 视频摄制
    
    183             case REQUEST_CODE_TAKE_VIDEO:
    
    184                 if (resultCode == RESULT_OK)
    
    185                 {
    
    186                     Uri uriVideo = data.getData();
    
    187                     Cursor cursor = this.getContentResolver().query(uriVideo, null, null, null, null);
    
    188                     if (cursor.moveToNext())
    
    189                     {
    
    190                         strVideoPath = cursor.getString(cursor.getColumnIndex("_data"));
    
    191                         Toast.makeText(this, strVideoPath, Toast.LENGTH_SHORT).show();
    
    192                     }
    
    193                 }
    
    194                 break;
    
    195         }
    
    196         super.onActivityResult(requestCode, resultCode, data);
    
    197     }
    
    198 }
  • 第三步:将文件转为String对象
    View Code
     1 public static String readStream(String path)  throws Exception
    
     2     {
    
     3         File file = new File(path);
    
     4         InputStream inStream = new FileInputStream(file);
    
     5         byte[] buffer = new byte[1024];
    
     6         int len = -1;
    
     7         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    
     8         while ((len = inStream.read(buffer)) != -1)
    
     9         {
    
    10             outStream.write(buffer, 0, len);
    
    11         }
    
    12         byte[] data = outStream.toByteArray();
    
    13         String mImage = new String(Base64.encode(data));
    
    14         outStream.close();
    
    15         inStream.close();
    
    16         return mImage;
    
    17     }

     

  • 将String转为file
    View Code
     1 public static boolean string2File(String res, String filePath)
    
     2     {
    
     3         boolean flag = true;
    
     4         BufferedReader bufferedReader = null;
    
     5         BufferedWriter bufferedWriter = null;
    
     6         try
    
     7         {
    
     8             File distFile = new File(filePath);
    
     9             if (!distFile.getParentFile().exists())
    
    10                 distFile.getParentFile().mkdirs();
    
    11             bufferedReader = new BufferedReader(new StringReader(res));
    
    12             bufferedWriter = new BufferedWriter(new FileWriter(distFile));
    
    13             char buf[] = new char[1024]; // 字符缓冲区
    
    14             int len;
    
    15             while ((len = bufferedReader.read(buf)) != -1)
    
    16             {
    
    17                 bufferedWriter.write(buf, 0, len);
    
    18             }
    
    19             bufferedWriter.flush();
    
    20             bufferedReader.close();
    
    21             bufferedWriter.close();
    
    22         }
    
    23         catch (IOException e)
    
    24         {
    
    25             e.printStackTrace();
    
    26             flag = false;
    
    27             return flag;
    
    28         }
    
    29         finally
    
    30         {
    
    31             if (bufferedReader != null)
    
    32             {
    
    33                 try
    
    34                 {
    
    35                     bufferedReader.close();
    
    36                 }
    
    37                 catch (IOException e)
    
    38                 {
    
    39                     e.printStackTrace();
    
    40                 }
    
    41             }
    
    42         }
    
    43         return flag;
    
    44     }

    最后注意的一点是别忘了在AndroidManifest.xml中添加相应的权限:

    View Code
         <!-- 在SDCard中创建与删除文件权限 -->  
    
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
    
        <!-- 申请使用摄像头的权限 -->  
    
        <uses-permission android:name="android.permission.CAMERA"/>  
    
        <!-- 申请录音权限 -->
    
        <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    
        <!--SDCard存储文件的权限  -->
    
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  • 到此功能基本完成了。

  1. 在这里在记录一点题外的东西,比较细微的东西,就是利用java的反射机制动态调用相应方法。
    • 客户端传递服务服务id,服务端根据服务id解析出类名和方法名,并执行改方法。
       1 public void invoke(String mClassName,String mMethodName)
      
       2     {
      
       3          //动态调用
      
       4          Class   clazz=Class.forName(mClassName);
      
       5         //调用没有参数的构造函数得到一个实例
      
       6          Object   instance=clazz.newInstance();
      
       7         //第二个参数表示方法参数的类型 
      
       8          Method   method=clazz.getDeclaredMethod(mMethodName, String.class);
      
       9         //第一个参数是类对象,后面传递运行这个方法的参数 
      
      10          mRetunInfo = (String)method.invoke(instance,mDate);
      
      11     }

       

 

 

你可能感兴趣的:(android)