2015-08-28 71 views
0

我已经交给了一个现有的android项目,并且已经使用android进行了多年的开发。通过选项菜单项保存屏幕截图文件android

我必须截图并保存,以便用户可以通过电子邮件或文本消息发送它。

我有截图并相信我知道如何保存它,但我想我错过了一步。我正在测试设备不AVD。

[编辑] 当测试我有设备通过USB连接,我运行应用程序通过Eclipse,我拿我的截图,然后退出应用程序,并打开画廊,我看不到图像文件,离开画廊打开,如果我拔掉USB,图像出现在画廊中。

屏幕截图和保存通过选项菜单项进行。大部分内容是在幕后处理的,一旦完成就会显示吐司说已保存。

正如您在下面看到的,我刚刚从MenuItem中调用了takeScreenshot(),但它就像它在活动完成之前没有完成保存文件。

我可能会错过什么?我需要为这个程序创建另一个类吗?

public class GraphView extends Activity { 

    .... 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (item.getItemId() == R.id.take_screenshot_menu_item) 
     { 
      takeScreenshot(); 
      return true; 
     } 
    } 

    private void takeScreenshot() { 
     Date now = new Date(); 
     android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now); 

     try { 
      // image naming and path to include sd card appending name you choose for file 
      String imgPath = Environment.getExternalStorageDirectory().toString() + "/Pictures/SMA/"; 
      String filename = now + ".jpg"; 

      // create bitmap screen capture 
      View v1 = getWindow().getDecorView().getRootView(); 
      v1.setDrawingCacheEnabled(true); 
      Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
      v1.setDrawingCacheEnabled(false); 

      File imagePath = new File(imgPath); 
      imagePath.mkdirs(); 

      File outputFile = new File(imagePath, filename); 
      FileOutputStream outputStream = new FileOutputStream(outputFile); 
      int quality = 100; 
      bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
      outputStream.flush(); 
      outputStream.close(); 

      showMsg("Screenshot saved to..."); 
     } catch (Throwable e) { 
      // Several error may come out with file handling or OOM 
      e.printStackTrace(); 
     } 
    } 

    private void showMsg(String msg) { 
     Toast toast = Toast.makeText(GraphView.this, msg, Toast.LENGTH_LONG); 
     toast.setGravity(Gravity.CENTER, toast.getXOffset()/2, toast.getYOffset()/2); 
     toast.show(); 
    } 
} 
+0

尝试使用switch case与onOptionsItemSelected –

+0

我想你是缺少返回语句如下返回super.onOptionsItemSelected(item); –

回答

0

不完全知道如何这有助于但它没有。由于图像文件没有保存后的画廊立即显示出来,我增加了以下内容:

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

这必须刷新以某种形式或时尚的画廊,现在我可以看到图像文件马上

0

改变你的onOptionsItemSelected(),如下

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.take_screenshot_menu_item: 
     takeScreenshot(); 
     break; 
    default: 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

嗨Karan,恐怕这并没有改变任何东西,我的确切步骤是在编辑问题 – Hank