第一步
2 |
Intent intent = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
3 |
startActivityForResult(intent,
0 );
|
5 |
} catch
(ActivityNotFoundException e) {
|
[代码] 第二步
02 |
protected
void onActivityResult( int
requestCode, int
resultCode, Intent data) {
|
04 |
if
(requestCode != 0 ) {
|
07 |
super .onActivityResult(requestCode, resultCode, data);
|
08 |
Bundle extras = data.getExtras();
|
09 |
Bitmap b = (Bitmap) extras.get( "data" );
|
13 |
ImageView a = (ImageView)findViewById(R.id.imageView1);
|
19 |
} catch
(Exception e) {
|
21 |
System.out.println(e.getMessage());
|
最近需要做手机拍照([1]、调用系统相机【博客最后】;[2]、自己写照相机布局),预览,上传功能。特地研究了下android的手机拍照,其实不难。
参考:
http://blog.csdn.net/cfwdl/article/details/5746708
http://mjbb.iteye.com/blog/1018006
http://blog.csdn.net/hellogv/article/details/5962494
1、上传文件功能没啥好说的,网上很多讲的,只要细心点,按照格式来写发送的数据,都是没有问题的。如果遇到问题,欢迎留言讨论、
2、预览也没啥讲的,就用Gallery和ImageSwitcher就行,我做的很简单(参考代码)。
附上流程图:
拍照功能:【预览尺寸有知道的朋友留言告知。】
- importjava.io.BufferedOutputStream;
-
importjava.io.File;
-
importjava.io.FileOutputStream;
-
importjava.io.IOException;
-
importandroid.app.Activity;
-
importandroid.app.AlertDialog;
-
importandroid.content.DialogInterface;
-
importandroid.content.Intent;
-
importandroid.graphics.Bitmap;
-
importandroid.graphics.BitmapFactory;
-
importandroid.graphics.PixelFormat;
-
importandroid.hardware.Camera;
-
importandroid.hardware.Camera.AutoFocusCallback;
-
importandroid.hardware.Camera.PictureCallback;
-
importandroid.hardware.Camera.ShutterCallback;
-
importandroid.os.Bundle;
-
importandroid.os.Environment;
-
importandroid.util.Log;
-
importandroid.view.KeyEvent;
-
importandroid.view.SurfaceHolder;
-
importandroid.view.SurfaceView;
-
importandroid.view.View;
-
importandroid.view.View.OnClickListener;
-
importandroid.widget.Button;
-
importcom.peacemap.photo.po.Const;
-
-
publicclassTakePhotoActextendsActivityimplementsSurfaceHolder.Callback{
-
-
privatestaticStringimgPath=Environment.getExternalStorageDirectory().getPath()+"/"+Const.imageDir;
-
-
privateSurfaceViewsurfaceView;
-
privateSurfaceHoldersurfaceHolder;
-
privateButtontakePicView,exitView;
-
-
privateCameramCamera;
-
-
@Override
-
publicvoidonCreate(BundlesavedInstanceState){
-
-
super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
-
-
-
-
takePicView=(Button)this.findViewById(R.id.takepic);
- takePicView.setOnClickListener(TakePicListener);
-
exitView=(Button)this.findViewById(R.id.exit);
-
exitView.setOnClickListener(newOnClickListener(){
-
@Override
-
publicvoidonClick(Viewv){
- finish();
- }
- });
-
surfaceView=(SurfaceView)this.findViewById(R.id.surface_camera);
- surfaceHolder=surfaceView.getHolder();
-
surfaceHolder.addCallback(this);
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
-
-
checkSoftStage();
- }
-
-
-
privatevoidcheckSoftStage(){
-
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
-
-
Filefile=newFile(imgPath);
-
if(!file.exists()){
- file.mkdir();
- }
-
}else{
-
newAlertDialog.Builder(this).setMessage("检测到手机没有存储卡!请插入手机存储卡再开启本应用。")
-
.setPositiveButton("确定",newDialogInterface.OnClickListener(){
-
@Override
-
publicvoidonClick(DialogInterfacedialog,intwhich){
- finish();
- }
- }).show();
- }
- }
-
-
-
privatefinalOnClickListenerTakePicListener=newOnClickListener(){
-
@Override
-
publicvoidonClick(Viewv){
-
mCamera.autoFocus(newAutoFoucus());
- }
- };
-
-
-
privatefinalclassAutoFoucusimplementsAutoFocusCallback{
-
@Override
-
publicvoidonAutoFocus(booleansuccess,Cameracamera){
-
if(success&&mCamera!=null){
-
mCamera.takePicture(mShutterCallback,null,mPictureCallback);
- }
- }
- }
-
-
privatefinalPictureCallbackmPictureCallback=newPictureCallback(){
-
@Override
-
publicvoidonPictureTaken(byte[]data,Cameracamera){
-
try{
-
StringfileName=System.currentTimeMillis()+".jpg";
-
Filefile=newFile(imgPath,fileName);
-
Bitmapbm=BitmapFactory.decodeByteArray(data,0,data.length);
-
BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(file));
-
bm.compress(Bitmap.CompressFormat.JPEG,60,bos);
- bos.flush();
- bos.close();
-
-
Intentintent=newIntent(TakePhotoAct.this,PictureViewAct.class);
-
intent.putExtra("imagePath",file.getPath());
- startActivity(intent);
-
}catch(Exceptione){
- e.printStackTrace();
- }
- }
- };
-
-
-
privatefinalShutterCallbackmShutterCallback=newShutterCallback(){
-
publicvoidonShutter(){
-
Log.d("ShutterCallback","...onShutter...");
- }
- };
-
-
@Override
-
-
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
-
intheight){
- Camera.Parametersparam=mCamera.getParameters();
-
- param.setPictureFormat(PixelFormat.JPEG);
-
-
-
- param.setPictureSize(Const.width,Const.height);
- mCamera.setParameters(param);
-
- mCamera.startPreview();
- }
-
@Override
-
-
publicvoidsurfaceCreated(SurfaceHolderholder){
-
try{
-
mCamera=Camera.open();
- mCamera.setPreviewDisplay(holder);
-
}catch(IOExceptione){
- mCamera.release();
-
mCamera=null;
- }
- }
-
-
@Override
-
-
publicvoidsurfaceDestroyed(SurfaceHolderholder){
- mCamera.stopPreview();
-
if(mCamera!=null)mCamera.release();
-
mCamera=null;
- }
-
-
@Override
-
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
-
if(keyCode==KeyEvent.KEYCODE_CAMERA){
-
mCamera.autoFocus(newAutoFoucus());
-
returntrue;
-
}else{
-
returnfalse;
- }
- }
- }
xml:
- <?xmlversion="1.0"encoding="utf-8"?>
-
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
-
android:orientation="vertical"
-
android:layout_width="fill_parent"
-
android:layout_height="fill_parent"
-
>
-
<SurfaceView
-
android:id="@+id/surface_camera"
-
android:layout_width="fill_parent"
-
android:layout_height="fill_parent"
-
android:layout_weight="1"
-
/>
-
<LinearLayout
-
android:orientation="horizontal"
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content">
-
-
<Button
-
android:text="拍照"
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/takepic"
-
/>
-
<Button
-
android:text="退出"
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/exit"
-
/>
-
</LinearLayout>
-
</LinearLayout>
预览功能:
- importjava.io.File;
-
importjava.util.ArrayList;
-
importjava.util.List;
-
importandroid.app.Activity;
-
importandroid.app.AlertDialog;
-
importandroid.content.ComponentName;
-
importandroid.content.DialogInterface;
-
importandroid.content.Intent;
-
importandroid.graphics.Bitmap;
-
importandroid.graphics.BitmapFactory;
-
importandroid.graphics.drawable.BitmapDrawable;
-
importandroid.os.Bundle;
-
importandroid.os.Environment;
-
importandroid.util.Log;
-
importandroid.view.Menu;
-
importandroid.view.MenuItem;
-
importandroid.view.MotionEvent;
-
importandroid.view.View;
-
importandroid.view.View.OnTouchListener;
-
importandroid.view.animation.AnimationUtils;
-
importandroid.widget.AdapterView;
-
importandroid.widget.Gallery;
-
importandroid.widget.ImageSwitcher;
-
importandroid.widget.ImageView;
-
importandroid.widget.LinearLayout.LayoutParams;
-
importandroid.widget.ViewSwitcher.ViewFactory;
-
importcom.peacemap.photo.adapter.ImageAdapter;
-
importcom.peacemap.photo.po.Const;
-
-
publicclassPhotoScanActextendsActivityimplementsViewFactory{
-
-
privatestaticStringimgPath=Environment.getExternalStorageDirectory().getPath()+"/"+Const.imageDir;
-
-
privateImageSwitcherimageSwitcher;
-
privateGallerygallery;
-
privateList<String>photoList;
-
privateintdownX,upX;
-
privateStringnewFilePath;
-
-
@Override
-
protectedvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
- setContentView(R.layout.photoscan);
-
- photoList=readFileList();
-
- imageSwitcher=(ImageSwitcher)findViewById(R.id.switcher);
-
imageSwitcher.setFactory(this);
-
-
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
- android.R.anim.fade_in));
-
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
- android.R.anim.fade_out));
- imageSwitcher.setOnTouchListener(touchListener);
- gallery=(Gallery)findViewById(R.id.gallery);
-
gallery.setAdapter(newImageAdapter(this,photoList));
-
gallery.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){
-
@Override
-
publicvoidonItemSelected(AdapterView<?>arg0,Viewarg1,
-
intposition,longwhen){
- newFilePath=photoList.get(position);
- Bitmapbm=BitmapFactory.decodeFile(photoList.get(position));
-
BitmapDrawablebd=newBitmapDrawable(bm);
- imageSwitcher.setImageDrawable(bd);
- }
-
@Override
-
publicvoidonNothingSelected(AdapterView<?>arg0){}
- });
- }
-
-
-
privateOnTouchListenertouchListener=newView.OnTouchListener(){
-
@Override
-
publicbooleanonTouch(Viewv,MotionEventevent){
-
if(event.getAction()==MotionEvent.ACTION_DOWN)
- {
-
downX=(int)event.getX();
-
returntrue;
- }
-
elseif(event.getAction()==MotionEvent.ACTION_UP)
- {
-
upX=(int)event.getX();
-
intindex=0;
-
if(upX-downX>100)
- {
-
-
if(gallery.getSelectedItemPosition()==0)
-
index=gallery.getCount()-1;
-
else
-
index=gallery.getSelectedItemPosition()-1;
- }
-
elseif(downX-upX>100)
- {
-
-
if(gallery.getSelectedItemPosition()==(gallery.getCount()-1))
-
index=0;
-
else
-
index=gallery.getSelectedItemPosition()+1;
- }
-
-
gallery.setSelection(index,true);
-
returntrue;
- }
-
returnfalse;
- }
- };
-
-
privateList<String>readFileList(){
-
List<String>fileList=newArrayList<String>();
-
FilefileDir=newFile(imgPath);
- File[]files=fileDir.listFiles();
-
if(files!=null){
-
for(Filefile:files){
- StringfileName=file.getName();
-
if(fileName.lastIndexOf(".")>0
-
&&fileName.substring(fileName.lastIndexOf(".")+1,
-
fileName.length()).equals("jpg")){
- fileList.add(file.getPath());
- }
- }
- }
-
returnfileList;
- }
-
@Override
-
publicViewmakeView(){
-
ImageViewimageView=newImageView(this);
- imageView.setScaleType(ImageView.ScaleType.CENTER);
-
imageView.setLayoutParams(newImageSwitcher.LayoutParams(
- LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
-
returnimageView;
- }
-
-
-
publicfinalstaticintITEM_1_ID=Menu.FIRST;
-
publicfinalstaticintITEM_2_ID=Menu.FIRST+1;
-
-
@Override
-
publicbooleanonCreateOptionsMenu(Menumenu){
-
super.onCreateOptionsMenu(menu);
-
menu.add(0,ITEM_1_ID,0,"我要上传");
-
menu.add(0,ITEM_2_ID,1,"我要拍照");
-
returntrue;
- }
-
-
@Override
-
publicbooleanonOptionsItemSelected(MenuItemitem){
-
super.onOptionsItemSelected(item);
-
switch(item.getItemId()){
-
case1:{
-
Intentintent=newIntent(PhotoScanAct.this,PictureViewAct.class);
-
intent.putExtra("imagePath",newFilePath);
- startActivity(intent);
-
break;
- }
-
case2:{
-
startActivity(newIntent(this,TakePhotoAct.class));
-
break;
- }
- }
-
returntrue;
- }
- }
ImageAdapter适配器:
- importjava.util.List;
-
importandroid.content.Context;
-
importandroid.graphics.Bitmap;
-
importandroid.graphics.BitmapFactory;
-
importandroid.view.View;
-
importandroid.view.ViewGroup;
-
importandroid.widget.BaseAdapter;
-
importandroid.widget.Gallery;
-
importandroid.widget.ImageView;
-
-
publicclassImageAdapterextendsBaseAdapter{
-
privateList<String>picList;
-
privateContextmContext;
-
publicImageAdapter(ContextmContext,List<String>picList){
-
this.mContext=mContext;
-
this.picList=picList;
- }
-
-
@Override
-
publicintgetCount(){
-
returnpicList.size();
- }
-
-
@Override
-
publicObjectgetItem(intposition){
-
-
returnpicList.get(position);
- }
-
-
@Override
-
publiclonggetItemId(intposition){
-
-
returnposition;
- }
-
@Override
-
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
-
ImageViewimage=newImageView(mContext);
- Bitmapbm=BitmapFactory.decodeFile(picList.get(position));
- image.setImageBitmap(bm);
- image.setScaleType(ImageView.ScaleType.CENTER_CROP);
-
image.setLayoutParams(newGallery.LayoutParams(100,100));
-
returnimage;
- }
- }
xml:
- <?xmlversion="1.0"encoding="utf-8"?>
-
<RelativeLayout
-
xmlns:android="http://schemas.android.com/apk/res/android"
-
android:layout_width="match_parent"
-
android:layout_height="match_parent">
-
-
<ImageSwitcher
-
android:id="@+id/switcher"
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
></ImageSwitcher>
-
-
<Gallery
-
android:id="@+id/gallery"
-
android:layout_width="match_parent"
-
android:background="#55000000"
-
android:layout_height="100dip"
-
android:layout_alignParentBottom="true"
-
android:layout_alignParentLeft="true"
-
android:gravity="center_vertical"
-
android:spacing="8dip"
-
/>
-
</RelativeLayout>
上传工具类:
- importjava.io.BufferedReader;
-
importjava.io.DataOutputStream;
-
importjava.io.FileInputStream;
-
importjava.io.InputStream;
-
importjava.io.InputStreamReader;
-
importjava.net.HttpURLConnection;
-
importjava.net.URL;
-
importjava.util.Map;
-
importjava.util.Map.Entry;
-
importandroid.util.Log;
-
importcom.peacemap.photo.po.FileInfo;
-
-
publicclassPostFile{
-
privatestaticPostFilepostFile=newPostFile();
-
-
privatefinalstaticStringLINEND="\r\n";
-
privatefinalstaticStringBOUNDARY="---------------------------7da2137580612";
-
privatefinalstaticStringPREFIX="--";
-
privatefinalstaticStringMUTIPART_FORMDATA="multipart/form-data";
-
privatefinalstaticStringCHARSET="utf-8";
-
privatefinalstaticStringCONTENTTYPE="application/octet-stream";
-
-
privatePostFile(){}
-
publicstaticPostFilegetInstance(){
-
returnpostFile;
- }
-
-
-
publicStringpost(StringactionUrl,Map<String,String>params,FileInfo[]files){
-
try{
-
URLurl=newURL(actionUrl);
- HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
-
urlConn.setDoOutput(true);
-
urlConn.setDoInput(true);
-
urlConn.setUseCaches(false);
-
urlConn.setRequestMethod("POST");
-
urlConn.setRequestProperty("connection","Keep-Alive");
-
urlConn.setRequestProperty("Charset",CHARSET);
-
urlConn.setRequestProperty("Content-Type",MUTIPART_FORMDATA+";boundary="+BOUNDARY);
-
-
DataOutputStreamdos=newDataOutputStream(urlConn.getOutputStream());
-
- StringentryText=bulidFormText(params);
-
Log.i("-------描述信息---------------",entryText);
- dos.write(entryText.getBytes());
-
-
StringBuffersb=newStringBuffer("");
-
-
for(FileInfofile:files){
- sb.append(PREFIX).append(BOUNDARY).append(LINEND);
-
sb.append("Content-Disposition:form-data;name=\""+file.getFileTextName()+"\";filename=\""+file.getFile().getAbsolutePath()+"\""+LINEND);
-
sb.append("Content-Type:"+CONTENTTYPE+";charset="+CHARSET+LINEND);
- sb.append(LINEND);
- dos.write(sb.toString().getBytes());
-
-
InputStreamis=newFileInputStream(file.getFile());
-
byte[]buffer=newbyte[1024];
-
intlen=0;
-
while((len=is.read(buffer))!=-1){
-
dos.write(buffer,0,len);
- }
- is.close();
- dos.write(LINEND.getBytes());
- }
-
-
byte[]end_data=(PREFIX+BOUNDARY+PREFIX+LINEND).getBytes();
- dos.write(end_data);
- dos.flush();
-
-
-
-
-
intcode=urlConn.getResponseCode();
-
if(code!=200){
- urlConn.disconnect();
-
return"";
-
}else{
-
BufferedReaderbr=newBufferedReader(newInputStreamReader(urlConn.getInputStream()));
-
Stringresult="";
-
Stringline=null;
-
while((line=br.readLine())!=null){
- result+=line;
- }
- br.close();
- urlConn.disconnect();
-
returnresult;
- }
-
}catch(Exceptione){
-
Log.e("--------上传图片错误--------",e.getMessage());
-
returnnull;
- }
- }
-
-
-
publicStringpost(StringactionUrl,Map<String,String>params,FileInfofileInfo){
-
returnpost(actionUrl,params,newFileInfo[]{fileInfo});
- }
-
-
-
privateStringbulidFormText(Map<String,String>paramText){
-
if(paramText==null||paramText.isEmpty())return"";
-
StringBuffersb=newStringBuffer("");
-
for(Entry<String,String>entry:paramText.entrySet()){
- sb.append(PREFIX).append(BOUNDARY).append(LINEND);
-
sb.append("Content-Disposition:form-data;name=\""
-
+entry.getKey()+"\""+LINEND);
-
- sb.append(LINEND);
- sb.append(entry.getValue());
- sb.append(LINEND);
- }
-
returnsb.toString();
- }
-
-
privateStringbuildFromFile(FileInfo[]files){
-
StringBuffersb=newStringBuffer();
-
for(FileInfofile:files){
- sb.append(PREFIX).append(BOUNDARY).append(LINEND);
-
sb.append("Content-Disposition:form-data;name=\""+file.getFileTextName()+"\";filename=\""+file.getFile().getAbsolutePath()+"\""+LINEND);
-
sb.append("Content-Type:"+CONTENTTYPE+";charset="+CHARSET+LINEND);
- sb.append(LINEND);
- }
-
returnsb.toString();
- }
- }
-------------------------------------我是个华丽的分割线,哇哈哈-----------------------------------------------
做完这个拍照后,感觉功能太简单,比如:设置图片大小,白天夜晚照相等等一些系统照相机带的功能都没有,因此用在项目中感觉不炫。 然后就用了简单点的,直接调用系统照相机了。本来想着简单呢,后来也遇到点问题。
(1)根据Camera Activity返回的时候,会带一个名为data的Bitmap对象,照片的缩略图(这个地方可以做各种修改,我没用到不说了),上代码:
- @Override
-
publicvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
- checkSoftStage();
-
-
try{
-
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
- startActivityForResult(intent,TAKE_PICTURE);
-
}catch(Exceptione){
- e.printStackTrace();
- }
- }
-
-
privatevoidcheckSoftStage(){
-
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
-
Filefile=newFile(imgPath);
-
if(!file.exists()){
- file.mkdir();
- }
-
}else{
-
newAlertDialog.Builder(this).setMessage("检测到手机没有存储卡!请插入手机存储卡再开启本应用。")
-
.setPositiveButton("确定",newDialogInterface.OnClickListener(){
-
@Override
-
publicvoidonClick(DialogInterfacedialog,intwhich){
- finish();
- }
- }).show();
- }
- }
-
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
-
if(resultCode==TAKE_PICTURE){
-
-
BitmapcameraBitmap=(Bitmap)data.getExtras().get("/sdcard/rtest.jpg");
-
- image.setImageBitmap(cameraBitmap);
-
- }
-
super.onActivityResult(requestCode,resultCode,data);
- }
(2)以上代码在我的小米手机上测试时,出现问题了。 返回的name为data的Bitmap对象是个Null,我发现小米照完相片之后,他会先跳到一个预览的界面(系统自带的页面),所以得不到Bitmap对象了。
因此我就先保存照片以及其路径,然后在onActivityResult中获取图片,做业务操作,代码如下:
- publicvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
- checkSoftStage();
-
-
try{
-
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
- startActivityForResult(intent,TAKE_PICTURE);
-
}catch(Exceptione){
- e.printStackTrace();
- }
-
-
try{
-
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
-
StringfileName=System.currentTimeMillis()+".jpg";
-
newImgPath=imgPath+"/"+fileName;
-
Uriuri=Uri.fromFile(newFile(imgPath,fileName));
- intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
- startActivityForResult(intent,TAKE_PICTURE);
-
}catch(Exceptione){
- e.printStackTrace();
- }
- }
-
@Override
-
protectedvoidonActivityResult(intrequestCode,
-
intresultCode,Intentdata){
-
Log.i("--------图片路径---------","------"+newImgPath+"---------");
-
-
}catch(Exceptione){
- e.printStackTrace();
- }
-
super.onActivityResult(requestCode,resultCode,data);
- }
分享到:
相关推荐
Android圆形相机预览窗口,圆形SurfaceView
android 手机,无预览拍照,代码实现比较简单,易读
Android自定义照相机 预览拍照 切换前后置摄像头 源码
android 8.0 webview 拍照、预览、二维码扫描比较完整的例子,对于权限检查控制,有比较完善的提示写法。可以下载后,直接在android studid上运行,编译版本和target版本均是SDK android 8.0,最低版本设置成了...
Android 端本地预览 PDF 文件,使用 AS2.3.3 Gradle 4.1 下载下来可以直接编译运行,内部支持加载本地 File ,也可以加载一个 URL 类型的 PDF 文件,如果恰恰你的 APP 不想调用第三方软件的话 这个 DEMO 非常适合你...
使用android studio,用camera2实现拍照并能够实时预览,并将照片存到手机里,路径代码有注释。保存格式:fpg。实现全网最简便的代码。
用texturreview实现摄像头预览和拍照,能够自动对焦,按钮有点挫,可以改为Relativelayout然后就好看一些
调用摄像头实现不预览拍照,后台拍照,并转换照片格式为竖屏,保存到SD卡
Android的图片加视频的预览,视频和图片分开管理,有需要的可以看看
android不预览,直接调用摄像头拍照。
Android 本地预览Excel,Word,PPT,PDF 解决Android asposed转Excel乱码问题 带有Jar包
android拍照上传客户端的完整代码,如果需要服务器端的代码,可以联系我!
实现android中的无预览的的拍照,不显示拍照界面
实现android附件打开预览效果,兼容android7.0,需要第三方软件打开,我用的是wps。
android 拍照上传照片(新)源码,需要的可以下载下去看看。
在android2.3下,实现静默拍照(无预览界面)
Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等 - 享受技术带来的快乐! - 博客频道 - CSDN.NET_files
android 拍照上传 图片剪切 注释详细 非常适合新手
修改Android5.0 launcher 小部件预览图片大小
其中包括一个自己写的Camera2的Demo,支持预览、拍照和视频录制,以及若干个网上找的,具有参考价值的Camera2 Demo。 具体看我的博客 : https://blog.csdn.net/EthanCo/article/details/131371887 ...