- 今天在项目中,需要获得手机本地相册中的照片路径,拍照并获得拍照后的路径,摄像并获得摄像后的路径,录音并获得录音后的路径,并将相应文件转为string格式以便利用json上传至服务端。
- 参考了网上的一些材料,在这里个人觉得比较好的一个资料是:。
- 在这里做个笔记,也希望能对大家有一点帮助。
- 第一步:布局文件,对于布局文件我总是做不好,希望大家凑合着 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>
- 到此功能基本完成了。
- 在这里在记录一点题外的东西,比较细微的东西,就是利用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 }