手机拍照无法保存照片后不让照片停留在保存界面

比较靠谱的选择图片以及拍照,保存图片 - 机遇&速度 - ITeye技术网站
博客分类:
在开发项目中用到这个功能,之前就按照学过的拍照和选择照片的功能,所以也没在意就写了上去,可是最后发现在有些机子里面获取到的数据时空的,所以会导致程序崩溃的情况出现,网上找了很多例子大多都是一样的,还是有问题,后来就查看跟踪了拍照后返回的数据写了下面的代码相对大多数机子是可行的,经测试还是比较靠谱的,包括拍照后图片翻转了90度问题都没问题。直接看代码:
第一:拍照选择界面:
import android.app.A
import android.content.ActivityNotFoundE
import android.content.I
import android.os.B
import android.provider.MediaS
import android.view.MotionE
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.LinearL
import android.widget.T
public class SelectPicPopupWindow extends Activity implements OnClickListener {
private Button btn_take_photo, btn_pick_photo, btn_
private LinearL
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alert_dialog);
intent = getIntent();
btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);
btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);
btn_cancel = (Button) this.findViewById(R.id.btn_cancel);
layout = (LinearLayout) findViewById(R.id.pop_layout);
// 添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity
layout.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
Toast.LENGTH_SHORT).show();
// 添加按钮监听
btn_cancel.setOnClickListener(this);
btn_pick_photo.setOnClickListener(this);
btn_take_photo.setOnClickListener(this);
// 实现onTouchEvent触屏函数但点击屏幕时销毁本Activity
public boolean onTouchEvent(MotionEvent event) {
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
//选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用
if (data.getExtras() != null)
intent.putExtras(data.getExtras());
if (data.getData()!= null)
intent.setData(data.getData());
setResult(1, intent);
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_take_photo:
//拍照我们用Action为MediaStore.ACTION_IMAGE_CAPTURE,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
} catch (Exception e) {
e.printStackTrace();
case R.id.btn_pick_photo:
//选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 2);
} catch (ActivityNotFoundException e) {
case R.id.btn_cancel:
第二:显示照片界面:
import android.app.A
import android.content.I
import android.graphics.B
import android.net.U
import android.os.B
import android.provider.MediaS
import android.view.V
import android.view.View.OnClickL
import android.widget.ImageV
public class MainActivity extends Activity {
private ImageV
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
photo = (ImageView) this.findViewById(R.id.text);
// 把文字控件添加监听,点击弹出自定义窗口
photo.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//使用startActivityForResult启动SelectPicPopupWindow当返回到此Activity的时候就会调用onActivityResult函数
startActivityForResult(new Intent(MainActivity.this,
SelectPicPopupWindow.class), 1);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) {
if (data != null) {
//取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意
Uri mImageCaptureUri = data.getData();
//返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取
if (mImageCaptureUri != null) {
//这个方法是根据Uri获取Bitmap图片的静态方法
image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageCaptureUri);
if (image != null) {
photo.setImageBitmap(image);
} catch (Exception e) {
e.printStackTrace();
Bundle extras = data.getExtras();
if (extras != null) {
//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
Bitmap image = extras.getParcelable("data");
if (image != null) {
photo.setImageBitmap(image);
第三:如果需要保存图片到卡或者上传图片可以用下面代码:
public static String savePicToSdcard(Bitmap bitmap, String path,
String fileName) {
String filePath = "";
if (bitmap == null) {
return fileP
filePath=path+ fileN
File destFile = new File(filePath);
OutputStream os =
os = new FileOutputStream(destFile);
press(CompressFormat.JPEG, 100, os);
os.flush();
os.close();
} catch (IOException e) {
filePath = "";
return fileP
上传图片的话我们可以获取bitmap的流然后上传,如上面方式获取,如要上传,上传代码自己实现,这个比较简单。
运行效果图:
(674.5 KB)
描述: 源码
下载次数: 3445
浏览 58040
图片翻转90度的问题还是有滴!OK,在这篇博文中有解答,谢谢指出。
浏览: 1181529 次
来自: 深圳
下载下来可以直接运行,也是我想要的
辛苦楼主了
等了一天.终于下载到了
就是这个获取时间的有问题。
SystemCloc ...有钱没钱回家过年,提前祝大家春节快乐!
苹果在微信推出了“用年画,来拜年”的页面,让您制作一张专属于自己的拜年贺卡,并发...
在威锋十周年之际,第九届『WeiPhone 摄影大赛』拉开了帷幕,现在第一季开始征稿了!
这算不算是农历新年到来前的一份惊喜?
此前有用户指出,苹果因为收到的差评太多而删除部分评论。
 除了苹果之外,地球也需要我们一起共同维护。
它并不需要开发者账户来下载,也就是说普通用户也可以体验。
活跃在七十年代的阿卡贝拉乐队“The Persuasions”的主唱起诉苹果,原因是苹果在 iPho...
《DROP'd》首先在画面上就一改以往的昏沉灰暗,使用了相当明亮的色调,一下子让人倍感...
《米亚夺宝传奇》采用了卡通的设计风格,而与此同时,多种色彩的合理搭配也让游戏的场...
科学原本应该是推动人类发展的力量,但是如果被坏人掌握的话,那对于人类来说就会是一...
这款游戏集快节奏操控与精选音轨于一身,试图打造与众不同的游戏体验。
国粹不愧是国粹,独特的皮影效果令人耳目一新!
经过最近几年的发展,MOBA 类游戏现在已经基本形成了其固定的游戏模式,审美疲劳之下...
游戏在中国区的本周新游推荐里不是太显眼,但当你抱着试一试的心情购买下载之后,就会...
此前有用户指出,苹果因为收到的差评太多而删除部分评论。
安全摄像头 Dropcam 公司联合创始人和前 CEO Greg Duffy 将离开谷歌,并加入苹果,根...
希望更多我们喜欢的电影或者游戏,能推出相应主题的iPhone配件~
数据居然是不准确的?不管醉没醉,我们都不能酒后驾车!
Gamevice 终于让 iPhone 7 更像一个游戏机~
手工制造,又是皮革,总之就是昂贵啊~
AirClip 不仅能够将 AirPods 连接在一起,还可以在不小心弄丢之后通过追踪器重新找回...
不少人都认为 Snap 与 iPhone 还是蛮配的,特别是需要记笔记的朋友~
6plus不能保留照相的相片
注册时间 最后登录
在线时间2479 小时 UID
主题帖子人气
金苹果, 积分 1873, 距离下一级还需 1127 积分
昨天买了个6plus,恢复了以前5s的备份,结果发现照相既然没有保留相片。无论照多少照片里面都是空的,用itools导入相片itools显示已经导入,但是打开照片那里还是空白的一张都没有。到底是怎么回事呢?已经折腾一个晚上了,弄不明白。求助各位大神指点一下,谢谢了!其他的都正常,就是照相有问题!
注册时间 最后登录
在线时间2479 小时 UID
主题帖子人气
没有人知道怎么解决吗?就大神指点了,快疯了。
注册时间 最后登录
在线时间108 小时 UID
主题帖子人气
注册时间 最后登录
在线时间2479 小时 UID
主题帖子人气
注册时间 最后登录
在线时间183 小时 UID
主题帖子人气
一般都是ilcud照片同步完事了。。。。
注册时间 最后登录
在线时间104 小时 UID
主题帖子人气
你应该用iTunes的备份,然后在用iTunes恢复。
有些功能导入的时候权限不够,在工具上能看到,在iPhone里面是看不见的
注册时间 最后登录
在线时间183 小时 UID
主题帖子人气
ilcuod自动的,没有理睬过,,,过一会就都有了,呵呵,你开了ilcuod照片嘛?
注册时间 最后登录
在线时间505 小时 UID
主题帖子人气
先“还原所有设置”,还原之前把开机密码关掉,查找我的爱疯关掉。看看能否解决,没解决再用“抹掉所有内容和设置”
注册时间 最后登录
在线时间47 小时 UID
主题帖子人气
目测。。。没问题
注册时间 最后登录
在线时间1660 小时 UID
主题帖子人气
先用itunes授权电脑,再备份恢复看看
威锋旗下产品
Hi~我是威威!
沪公网安备 29号 | 沪ICP备号-1
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。public&class&PhotographActivity&extends&Activity&implements
SeekBar.OnSeekBarChangeListener,&OnClickListener,&Runnable&{
private&ImageView&takePic,&back,&//&按钮
private&final&int&FLASH_AUTO&=&0;//&自动闪光
private&final&int&FLASH_OFF&=&1;//&闪光灯关闭
private&final&int&FLASH_ON&=&2;&//&闪光灯打开
private&int&flashImg[]&=&{&R.drawable.light_auto_confirm,
R.drawable.light_off_confirm,&R.drawable.light_on_confirm&};//&闪光灯图标
private&boolean&preview&=&false,&flashOpen&=&//&preview预览&flashOpen闪光灯
private&Camera&//&硬件相机
private&SurfaceView&cameraBG;//&相机预览
@SuppressWarnings(&unused&)
private&Uri&videoFileP
//&PopupWindow和AlertDialog都是Android对话框的内容,不同的是PopupWindow是阻塞式对话框
PopupWindow&popupW
private&Camera.Parameters&//&照相机参数集
private&BitmapFactory.Options&options&=&new&BitmapFactory.Options();
private&int&ScreenW,&ScreenH;//&屏幕宽高
public&void&onCreate(Bundle&savedInstanceState)&{
//&获得屏幕宽高
DisplayMetrics&metrics&=&new&DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
ScreenW&=&metrics.widthP
ScreenH&=&metrics.heightP
Log.d(&屏幕宽高&,&ScreenW&+&&,&&+&ScreenH);
if&(!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))&{//&SD卡允许读写
Toast.makeText(PhotographActivity.this,&&SD卡没有插入或不能读写&,
Toast.LENGTH_LONG).show();
Window&window&=&getWindow();
//&只要这个窗口是用户可见的,保持设备的屏幕打开及明亮。
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//&选择支持半透明模式,在有surfaceview的activity中使用。
window.setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);//&去掉标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//&去掉信息栏
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_photograph);
@SuppressLint(&NewApi&)
private&void&init()&{
options.inSampleSize&=&2;//&图片宽高都为原来的2分之一,即图片为原来的4分之一
takePic&=&(ImageView)&findViewById(R.id.btn_picture);//&拍照
back&=&(ImageView)&findViewById(R.id.btn_backcapter);//&返回
flash&=&(ImageView)&findViewById(R.id.btn_flash);//&调整闪光效果
cameraBG&=&(SurfaceView)&findViewById(R.id.camrea);//&相机预览
//&固定surfaceView的高宽
cameraBG.getHolder().setFixedSize(ScreenW,&ScreenH);
//&设置该surfaceView不用自己维护缓冲区
cameraBG.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//&设置surfaceView的回调函数
cameraBG.getHolder().addCallback(new&SurfaceCallback());
takePic.setOnClickListener(this);
back.setOnClickListener(this);
flash.setOnClickListener(this);
cameraBG.setOnClickListener(this);
private&final&class&SurfaceCallback&implements&SurfaceHolder.Callback&{
public&void&surfaceCreated(SurfaceHolder&holder)&{
if&(camera&!=&null)&{
camera.release();//&相机释放
camera&=&Camera.open();//&打开相机
camera.setDisplayOrientation(90);//&旋转镜头
parameters&=&camera.getParameters();//&获取相机参数集
if&(parameters.getFlashMode()&==&null)&{
flash.setImageResource(flashImg[FLASH_OFF]);
Toast.makeText(PhotographActivity.this,&&无闪光灯&,
Toast.LENGTH_SHORT).show();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
List&Size&&SupportedPreviewSizes&=&parameters
.getSupportedPreviewSizes();//&获取支持预览照片的尺寸
Size&previewSize&=&SupportedPreviewSizes.get(0);//&从List取出Size
parameters
.setPreviewSize(previewSize.width,&previewSize.height);//&设置预览照片的大小
List&Size&&supportedPictureSizes&=&parameters
.getSupportedPictureSizes();//&获取支持保存图片的尺寸
Size&pictureSize&=&supportedPictureSizes.get(0);//&从List取出Size
parameters
.setPictureSize(pictureSize.width,&pictureSize.height);//&设置照片的大小
camera.setParameters(parameters);
camera.setPreviewDisplay(cameraBG.getHolder());//&设置相机预览
}&catch&(IOException&e)&{
e.printStackTrace();
camera.startPreview();//&开始预览
preview&=&
public&void&surfaceChanged(SurfaceHolder&holder,&int&format,&int&width,
int&height)&{
public&void&surfaceDestroyed(SurfaceHolder&holder)&{
if&(camera&!=&null)&{
if&(preview)&{
camera.stopPreview();
camera.release();
public&boolean&onKeyDown(int&keyCode,&KeyEvent&event)&{
if&(camera&!=&null&&&&event.getRepeatCount()&==&0)&{
switch&(keyCode)&{
case&KeyEvent.KEYCODE_CAMERA:
case&KeyEvent.KEYCODE_DPAD_CENTER:
takPicture();
case&KeyEvent.KEYCODE_BACK:
if&(flashOpen)&{
popupWindow.dismiss();
private&final&class&TakePictureCallback&implements&PictureCallback&{
public&void&onPictureTaken(byte[]&data,&Camera&camera)&{
String&sdStatus&=&Environment.getExternalStorageState();
if&(!sdStatus.equals(Environment.MEDIA_MOUNTED))&{
//&检测sd是否可用
Toast.makeText(PhotographActivity.this,&&没有SD卡或SD卡不可用!&,
Toast.LENGTH_LONG).show();
Log.d(&解码&,&&data.length=&&+&data.length);
//&解码指定字节数组中的一个不变的位图
Bitmap&bitmap&=&BitmapFactory.decodeByteArray(data,&0,
data.length,&options);
Log.d(&解码&,&&1*******&);
//&旋转图片&动作
Matrix&matrix&=&new&Matrix();
matrix.postRotate(90);
Log.d(&保存照片&,&&0&);
//&创建新的图片
bitmap&=&Bitmap.createBitmap(bitmap,&0,&0,&bitmap.getWidth(),
bitmap.getHeight(),&matrix,&true);
Uri&resource_uri&=&Uri.parse(MediaStore.Images.Media
.insertImage(getContentResolver(),&bitmap,&null,&null));
Log.d(&保存照片&,&&1&);
BufferedOutputStream&bos&=&
bitmap&=&MediaStore.Images.Media.getBitmap(
getContentResolver(),&resource_uri);
String&name&=&getCurrentTime()&+&&.jpg&;
File&file&=&new&File(
Environment.getExternalStorageDirectory()
+&&/DCIM/Camera/&);
file.mkdirs();//&尝试创建系统默相册文件夹
String&image_Path&=&Environment
.getExternalStorageDirectory()
+&&/DCIM/Camera/&
bos&=&new&BufferedOutputStream(new&FileOutputStream(
image_Path));
Log.d(&bos&,&bos.toString());
//&压缩位图到指定的输出流
//&第一个参数:压缩的格式
//&第二个参数:压缩的质量,100即为无损压缩
//&第三个参数:压缩到制定的流
pressFormat.JPEG,&100,&bos);//&把数据写入文件
bitmap.recycle();
scanPhoto(image_Path);//&扫描文件夹
ByteArrayOutputStream&baos&=&new&ByteArrayOutputStream();
Bitmap&bitmap2&=&MediaStore.Images.Media.getBitmap(
getContentResolver(),&resource_uri);
Log.d(&bitmap2&,&bitmap2.toString());
if&(press(CompressFormat.JPEG,&100,&baos))&{
byte[]&code&=&baos.toByteArray();
Log.d(&拍照0&,&code.toString());
byte[]&output&=&Base64.encode(code,&Base64.NO_WRAP);
Log.d(&拍照1&,&output.toString());
String&Str&=&new&String(output);
Log.d(&长度&,&Str.length()&+&&&);
JSONObject&jsonObject&=&new&JSONObject();
jsonObject.put(&imgFileStr&,&Str);
jsonObject.put(&imgPath&,&image_Path);
bitmap2.recycle();
Xxxplugin.callbackData.success(jsonObject);
}&catch&(Exception&e)&{
Log.d(&异常&,&e.toString());
}&finally&{
bos.close();
PhotographActivity.this.finish();
}&catch&(IOException&e)&{
e.getMessage();
public&void&takPicture()&{
camera.autoFocus(null);//&自动对焦
//&takePicture有一个重载,分别是三个参数,四个参数
//&三个参数的
//&第一个参数是按下快门触发
//&第二参数是得到原始图像时候触发
//&第三个是JPG图片(系统处理后触发);
//&四个参数的
//&第一个参数是按下快门触发
//&第二参数是得到原始图像时候触发
//&第三个是缩放和压缩图像时触发
//&第四个是JPG图片(系统处理后触发);
//&camera.takePicture(shutter,&raw,&jpeg)
//&camera.takePicture(shutter,&raw,&postview,&jpeg)
camera.takePicture(null,&null,&null,&new&TakePictureCallback());
public&void&onProgressChanged(SeekBar&seekBar,&int&progress,
boolean&fromUser)&{
camera.setParameters(parameters);
public&void&onStartTrackingTouch(SeekBar&seekBar)&{
public&void&onStopTrackingTouch(SeekBar&seekBar)&{
public&void&onClick(View&v)&{
switch&(v.getId())&{
case&R.id.btn_picture:
takePic.setEnabled(false);
takPicture();
case&R.id.btn_backcapter:
if&(flashOpen)&{
popupWindow.dismiss();
case&R.id.btn_flash:
if&(parameters.getFlashMode()&==&null)&{
Toast.makeText(PhotographActivity.this,&&无闪光灯&,
Toast.LENGTH_SHORT).show();
}&else&if&(parameters.getFlashMode()&==&Camera.Parameters.FLASH_MODE_AUTO)&{
flash.setImageResource(flashImg[FLASH_OFF]);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
}&else&if&(parameters.getFlashMode()&==&Camera.Parameters.FLASH_MODE_OFF)&{
flash.setImageResource(flashImg[FLASH_ON]);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
camera.setParameters(parameters);
}&else&if&(parameters.getFlashMode()&==&Camera.Parameters.FLASH_MODE_ON)&{
flash.setImageResource(flashImg[FLASH_AUTO]);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
camera.setParameters(parameters);
case&R.id.camrea:
camera.autoFocus(null);
public&void&run()&{
while&(true)&{
if&(camera&!=&null)&{
camera.autoFocus(null);
Thread.sleep(400);
}&catch&(InterruptedException&e)&{
e.printStackTrace();
&*&得到当前系统的时间
private&String&getCurrentTime()&{
SimpleDateFormat&format&=&new&SimpleDateFormat(&yyyyMMdd_HHmmss&);
String&str&=&format.format(new&Date());
&*&对文件夹进行扫描,使图库可以及时显示自己保存的图片(无需手机重启)
private&void&scanPhoto(String&path)&{
MediaScannerConnection.scanFile(PhotographActivity.this,
new&String[]&{&path&},&null,&null);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:163次
排名:千里之外
原创:16篇}

我要回帖

更多关于 开机停留在欢迎界面 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信