Android拍照保存在系统相册与照片不显示解决方法

系统已经有的东西,如果我们没有新的需求的话,直接调用是最直接的。下面讲讲调用系统相机拍照并保存图片和如何调用系统相册的方法。

首先看看调用系统相机的核心方法:

 代码如下 复制代码
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 startActivityForResult(camera, CAMERA);

相机返回的数据通过下面的回调方法取得,并处理:

 代码如下 复制代码

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
 
  if(requestCode == CAMERA && resultCode == Activity.RESULT_OK && null != data){
   String sdState=Environment.getExternalStorageState();
   if(!sdState.equals(Environment.MEDIA_MOUNTED)){
    GameLog.log(Tag, "sd card unmount");
    return;
   }
   new DateFormat();
   String name= DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA))+".jpg";
   Bundle bundle = data.getExtras();
   //获取相机返回的数据,并转换为图片格式
   Bitmap bitmap = (Bitmap)bundle.get("data");
   FileOutputStream fout = null;
   File file = new File("/sdcard/pintu/");
   file.mkdirs();
   String filename=file.getPath()+name;
   try {
    fout = new FileOutputStream(filename);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   }finally{
    try {
     fout.flush();
     fout.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   //显示图片
  
  }

}

 

下面是调用系统相册并取得照片的方法:

 代码如下 复制代码
Intent picture = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(picture, PICTURE);

下面是相应的回调方法:

 

 代码如下 复制代码

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
 
  if(requestCode == CAMERA && resultCode == Activity.RESULT_OK && null != data){
 

   Uri selectedImage = data.getData();
   String[] filePathColumns={MediaStore.Images.Media.DATA};
   Cursor c = this.getContentResolver().query(selectedImage, filePathColumns, null,null, null);
   c.moveToFirst();
   int columnIndex = c.getColumnIndex(filePathColumns[0]);
   String picturePath= c.getString(columnIndex);
   c.close();
   //获取图片并显示

  
  }

 
这样就完成了系统调用,很简单,但是有些朋友会碰到照片拍好了,在手机相册中发现照片不显示呀。

解决Android拍照保存在系统相册不显示的问题

MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "", "");通过上面的那句代码就能插入到系统图库,这时候有一个问题,就是我们不能指定插入照片的名字,而是系统给了我们一个当前时间的毫秒数为名字,有一个问题郁闷了很久,我还是先把insertImage的源码贴出来吧

 代码如下 复制代码

 

 /**
             * Insert an image and create a thumbnail for it.
             *
             * @param cr The content resolver to use
             * @param source The stream to use for the image
             * @param title The name of the image
             * @param description The description of the image
             * @return The URL to the newly created image, or <code>null</code> if the image failed to be stored
             *              for any reason.
             */
            public static final String insertImage(ContentResolver cr, Bitmap source,
                                                   String title, String description) {
                ContentValues values = new ContentValues();
                values.put(Images.Media.TITLE, title);
                values.put(Images.Media.DESCRIPTION, description);
                values.put(Images.Media.MIME_TYPE, "image/jpeg");

                Uri url = null;
                String stringUrl = null;    /* value to be returned */

                try {
                    url = cr.insert(EXTERNAL_CONTENT_URI, values);

                    if (source != null) {
                        OutputStream imageOut = cr.openOutputStream(url);
                        try {
                            source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
                        } finally {
                            imageOut.close();
                        }

                        long id = ContentUris.parseId(url);
                        // Wait until MINI_KIND thumbnail is generated.
                        Bitmap miniThumb = Images.Thumbnails.getThumbnail(cr, id,
                                Images.Thumbnails.MINI_KIND, null);
                        // This is for backward compatibility.
                        Bitmap microThumb = StoreThumbnail(cr, miniThumb, id, 50F, 50F,
                                Images.Thumbnails.MICRO_KIND);
                    } else {
                        Log.e(TAG, "Failed to create thumbnail, removing original");
                        cr.delete(url, null, null);
                        url = null;
                    }
                } catch (Exception e) {
                    Log.e(TAG, "Failed to insert image", e);
                    if (url != null) {
                        cr.delete(url, null, null);
                        url = null;
                    }
                }

                if (url != null) {
                    stringUrl = url.toString();
                }

                return stringUrl;
            }

上面方法里面有一个title,我刚以为是可以设置图片的名字,设置一下,原来不是,郁闷,哪位高手知道title这个字段是干嘛的,告诉下小弟,不胜感激!

当然Android还提供了一个插入系统相册的方法,可以指定保存图片的名字,我把源码贴出来吧

 

 代码如下 复制代码

   /**
             * Insert an image and create a thumbnail for it.
             *
             * @param cr The content resolver to use
             * @param imagePath The path to the image to insert
             * @param name The name of the image
             * @param description The description of the image
             * @return The URL to the newly created image
             * @throws FileNotFoundException
             */
            public static final String insertImage(ContentResolver cr, String imagePath,
                    String name, String description) throws FileNotFoundException {
                // Check if file exists with a FileInputStream
                FileInputStream stream = new FileInputStream(imagePath);
                try {
                    Bitmap bm = BitmapFactory.decodeFile(imagePath);
                    String ret = insertImage(cr, bm, name, description);
                    bm.recycle();
                    return ret;
                } finally {
                    try {
                        stream.close();
                    } catch (IOException e) {
                    }
                }
            }

啊啊,贴完源码我才发现,这个方法调用了第一个方法,这个name就是上面方法的title,晕死,这下更加郁闷了,反正我设置title无效果,求高手为小弟解答,先不管了,我们继续往下说

上面那段代码插入到系统相册之后还需要发条广播

 代码如下 复制代码

 

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); 

上面那条广播是扫描整个sd卡的广播,如果你sd卡里面东西很多会扫描很久,在扫描当中我们是不能访问sd卡,所以这样子用户体现很不好,用过微信的朋友都知道,微信保存图片到系统相册并没有扫描整个SD卡,所以我们用到下面的方法

 

 代码如下 复制代码

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);  
 Uri uri = Uri.fromFile(new File("/sdcard/image.jpg"));  
 intent.setData(uri);  
 mContext.sendBroadcast(intent); 

或者用MediaScannerConnection

 

 代码如下 复制代码

 

final MediaScannerConnection msc = new MediaScannerConnection(mContext, new MediaScannerConnectionClient() {  
  public void onMediaScannerConnected() {  
   msc.scanFile("/sdcard/image.jpg", "image/jpeg");  
  }  
  public void onScanCompleted(String path, Uri uri) {  
   Log.v(TAG, "scan completed");  
   msc.disconnect();  
  }  
 });  

也行你会问我,怎么获取到我们刚刚插入的图片的路径?呵呵,这个自有方法获取,insertImage(ContentResolver cr, Bitmap source,String title, String description),这个方法给我们返回的就是插入图片的Uri,我们根据这个Uri就能获取到图片的绝对路径

 

 代码如下 复制代码

private  String getFilePathByContentResolver(Context context, Uri uri) {
  if (null == uri) {
   return null;
  }
        Cursor c = context.getContentResolver().query(uri, null, null, null, null);
        String filePath  = null;
        if (null == c) {
            throw new IllegalArgumentException(
                    "Query on " + uri + " returns null result.");
        }
        try {
            if ((c.getCount() != 1) || !c.moveToFirst()) {
            } else {
             filePath = c.getString(
               c.getColumnIndexOrThrow(MediaColumns.DATA));
            }
        } finally {
            c.close();
        }
        return filePath;
    }

根据上面的那个方法获取到的就是图片的绝对路径

时间: 2024-09-20 17:19:23

Android拍照保存在系统相册与照片不显示解决方法的相关文章

Android拍照保存在系统相册不显示的问题解决方法_Android

可能大家都知道我们保存相册到Android手机的时候,然后去打开系统图库找不到我们想要的那张图片,那是因为我们插入的图片还没有更新的缘故,先讲解下插入系统图库的方法吧,很简单,一句代码就能实现 复制代码 代码如下: MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "", ""); 通过上面的那句代码就能插入到系统图库,这时候有一个问题,就是我们不能指定插入照片的名字,而是系统给了我

Android拍照保存在系统相册不显示的问题解决方法

可能大家都知道我们保存相册到Android手机的时候,然后去打开系统图库找不到我们想要的那张图片,那是因为我们插入的图片还没有更新的缘故,先讲解下插入系统图库的方法吧,很简单,一句代码就能实现 复制代码 代码如下: MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "", ""); 通过上面的那句代码就能插入到系统图库,这时候有一个问题,就是我们不能指定插入照片的名字,而是系统给了我

win7系统的IE浏览器脚本错误显示解决方法

  我们基本上win7旗舰版系统下载使用的用户基本上都是会有遇到IE浏览器出现了脚本错误问题的时候,出现了脚本错误就会让我们的上网使用受到一定的影响,出现这样的情况我们改怎么办呢,也不知道具体是哪里出了问题,今天我们就给大家一个解决方法. 1.我们可以先要看看问题的原因是出在哪个地方,我们先进行一下杀毒,看是不是病毒引起的,然后在看看我们电脑的防火墙设置是不是有阻止脚本运行这个设置,在来看看防毒程序里面的临时Internet文件. 2.如果我们win7电脑里面的安全等级设置的太高也会导致我们的运

uri-新手问android拍照保存后立即从Media.EXTERNAL_CONTENT_URI中查不到信息

问题描述 新手问android拍照保存后立即从Media.EXTERNAL_CONTENT_URI中查不到信息 调用系统拍照程序,并用putExtra(MediaStore.EXTRA_OUTPUT,path)保存了,在file explorer 也能看到图片,但是从Media.EXTERNAL_CONTENT_URI查不到信息,返回后在执行一次才能查到上次保存的图片的信息,本次 保存的还是查不到 解决方案 拍照之后在回调方法中获取的data数据中可以获取到 解决方案二: 直接用startAct

Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法

要原因是主体样式设置的问题:这里把appTheme设置一个style即可: <item name="android:windowBackground">@color/white</item> <!--下面这个属性很重要,有时候会出现某些机型在调用系统相册的时候,短暂的出现手机桌面现象--> <item name="android:windowIsTranslucent">false</item> <i

Win7系统下无法打开光盘的解决方法

  虽然现在大家都习惯于在网上观看一些视频,似乎光盘的使用率大大下降了,但是相比网上的视频资源,光盘视频像素更加高一些,而且网上很多都是盗版的,所以还是有部分人会一如既往的使用光盘.不知道是不是因为长时间不用光盘了,今天小编使用win7电脑打开光盘的时候无法打开了,这是怎么回事呢?小编首先排查了光驱的因素,看看是不是光驱坏了,但是并非光驱的原因,到底是什么原因呢?下面小编和大家分享Win7系统无法打开光盘的解决方法. Win7系统下无法打开光盘的解决方法教程 1.首先点击开始打开运行窗口,在运行

最新笔记本专用xp系统电池充不进电的解决方法

  我们知道笔记本电脑相对于台式机来说,有着不可比拟的携带方便的优点,不过对于xp系统用户来说,在使用笔记本电脑时总会遇到的问题是电脑充电的问题.一般情况下,笔记本电脑电池可以维持工作状态2个小时,不过有用户安装最新笔记本专用xp系统,发现电池充不了电.出现这种情况的原因是什么呢?我们又应该怎么办呢?下面小编就带大家一起去了解下! 方法如下: 1.检查电池,查看是否线路出现了松动导致连接不牢; 2.如果线路正常,还是充不进去,可以查看是否是电池的充电器的电路板坏了,换其他的充电器试下; 3.如果

xp系统下主题不能使用的解决方法

  xp系统下主题不能使用的解决方法          可以在桌面右击属性,点开主题的下拉箭头,可以看到以前安装的主题都不见了,桌面也变成了灰白色.也就是XP的经典模式. 从网上下载一批新的主题后进行主题安装,从桌面属性里点开后也看不到最新安装的主题,就出现了一个水墨主题,但点后也是显示不完整的. 为了解决这个问题,从我的电脑上打开C:WINDOWSResourcesThemes 进入主题安装的目录 双击一个主题文件,文件提示电脑主题的服务没有启动,好像找到了问题的所在. 打开控制面板,双击打开

win7系统出现网络连接中断的解决方法

win7系统出现网络连接中断的解决方法   1.其实出现上述所说的情况,多半是与电脑的电源设置选项有关的,想要解决这个问题,就将电源项更改一下即可. 2.咱们在屏幕右下角的任务栏窗口中找到网路连接图标,然后右键点击,选择打开网络和共享中心. 3.咱们找到目前正在使用的网络连接图标,注意在出现的窗口中可能有很多图标,但是咱们要选择的是目前正在使用的那一个,往往有绿色的信号标志.,找到后右键点击,选择属性. 4.在弹出来的窗口中点击配置按钮,然后就可以看到这里有一个"允许计算机关闭此设备以节约电源&