当前位置: 首页 > 知识库问答 >
问题:

Android BitmapFactory。选项。inSampleSize CAUSE应用程序崩溃

曾骁
2023-03-14

我们正在开发一款Android应用程序,它可以捕获图像并将其转换为位图,然后发布到Rest服务。

创建位图时,我们使用BitmapFactory。选项。isSample Size配置为值4,这在除HTC One之外的所有设备上都可以正常工作。HTC one中的图像失真。

当我们将该值更改为1时,它在HTC one上显示了良好的图像,但由于内存问题,应用程序在所有其他设备上崩溃。

该问题与可用堆大小有关。

  1. HTC one在HTC one上显示扭曲图像的原因是什么。
  2. 为什么S3上的应用程序崩溃,它也具有相同的构建版本16,但由于堆大小不可用而崩溃。
  3. 为什么所有像droid这样的低版本手机对于4的样本量都可以正常工作。
  4. 检查应用程序的可用内存空间并使用可用内存空间来使用BITMAP的最佳方法是什么。

当我们在清单文件中配置Android:largeHeap时,这似乎是可行的,但似乎不是一个可靠的解决方案。

我能够找到使用相机参数拍摄的照片的大小,然后得出位图的最佳样本大小。下面的代码解决了这个问题。但这是正确的方法吗?或者我也需要计算样本量,而不是1和4。

private Bitmap createImaegBitmap(byte[] data)
    {
        BitmapFactory.Options opt;

        opt = new BitmapFactory.Options();
        opt.inTempStorage = new byte[16 * 1024];
        Parameters parameters = ((ReceiptCollection)getApplication()).getParams();
        Size size = parameters.getPictureSize();

        int height11 = size.height;
        int width11 = size.width;
        float mb = (width11 * height11) / 1024000;

        if (mb > 4f)
            opt.inSampleSize = 4;
        else if (mb > 3f)
            opt.inSampleSize = 1;
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt);
        return bitmap;
    }

共有1个答案

扈昀
2023-03-14

看:
http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

1:因为... Direct from DOC:如果设置为值

2:我猜是因为不是所有的设备都有相同的可用内存。3:你需要计算样本量不只是设定一个数字。。。

2,3:所有设备都有不同的摄像头分辨率。

要解决这个问题,请阅读以下内容:http://developer.android.com/training/displaying-bitmaps/index.html

    public static Bitmap lessResolution(String filePath) {
    int reqHeight = 120;
    int reqWidth = 120;
    BitmapFactory.Options options = new BitmapFactory.Options();

    // First decode with inJustDecodeBounds=true to check dimensions
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth,
            reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeFile(filePath, options);
}

private static int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {

    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and
        // width
        final int heightRatio = Math.round((float) height
                / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will
        // guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    return inSampleSize;
}
 类似资料:
  • 问题内容: 当我尝试访问Flask应用程序时,该应用程序崩溃了。 这类似于this或this。但是,我的设置似乎正确。 flask.cli.NoAppException:提供的文件/路径(服务器)似乎不存在。请确认路径正确。如果应用不在PYTHONPATH上,请确保扩展名为.py 我的环境变量设置正确。 我的服务器文件是y目录中没有任何文件。 我不记得对代码进行任何特殊更改。该错误可能来自哪里?

  • 在以前的代码上,谁医生帮了我 现在,android应用程序在我的手机上运行时崩溃了,这是错误日志 第一个问题是在我用相机扫描二维码后,它不能显示在二维码的结果进入 第二个问题是,我从存储器中选择了一个QRcode图像,然后点击确认,它崩溃了 下面是我认为的问题 类型不匹配:推断的类型是Uri?但乌里是意料之中的 冗余SAM构造函数 'onRequestPermissionsResult(Int,数

  • 我正在Android中创建一个带有导航视图的tabLayout。我想将图标设置到选项卡布局的选项卡上。当我使用setIcon函数时,应用程序抛出一个空指针异常并崩溃。请帮帮我. 在android.app.activityThread.-wrap11(activityThread.java)在android.app.activityThread$H.HandleMessage(activityThr

  • 我正在创建一个呼叫阻止应用程序,当我添加复选框或单选按钮到我的布局,应用程序开始崩溃。 活动代码。 } 广播接收机代码 公共void onReceive(上下文、意图){ XML文件如下所示 错误日志如下

  • 所以我终于实现了用户选择在我尝试做oAuth2时使用哪个gmail帐户的能力……不幸的是,我有几个oAuth2问题没有得到回答…无论如何,在我单击登录按钮后,系统会提示我选择哪个gmail帐户的选项。但是,在我选择它并点击“确定”后,应用程序崩溃了。但是,我不确定为什么。 这是我的主要活动.java 这是返回的错误。 如果任何人有任何想法,这将是非常感谢。此外,我还需要对所选的gmail帐户进行o

  • 我正在创建我的第一个Firebase应用程序。它的要求之一是在网络不可用时运行。Firebase指南指出: 启用磁盘持久性允许我们的应用程序即使在重新启动应用程序后也保持其所有状态。我们只需一行代码就可以实现磁盘持久性。FirebaseDatabase。getInstance()。setPersistenceEnabled(true);启用磁盘持久性后,我们的同步数据和写入将在应用程序重新启动时持