Android N 디스플레이 크기가 작음보다 크게 설정된 경우 '캔버스 : 너무 큰 비트 맵을 그리려고합니다.'


83

새로 도입 된 Display sizeOS 설정이 너무 큰 값으로 설정된 경우 Android N에서 시작시 충돌하는 게시 된 앱이 있습니다.

logcat을 보면 다음 메시지가 표시됩니다.

java.lang.RuntimeException: Canvas: trying to draw too large(106,975,232 bytes) bitmap.

나는 첫 번째 활동에서 멋진 큰 배경 이미지를 보여주는 ImageView로 문제를 추적했습니다. 문제의 이미지는 2048x1066이고 내 일반 drawables디렉토리에 있으므로 밀도에 관계없이이 이미지가 사용됩니다.

Display size설정이 이면 모든 것이 정상적으로 작동합니다 Small. 하지만로 올라가면 Default작동이 중지됩니다. 그런 다음 이미지를 더 작은 이미지로 교체하면에서 작동 Default하지만으로 올라가면 Large다시 작동하지 않습니다.

내 생각 엔 조정 Display size하면 장치가 픽셀 밀도가 높은 물리적으로 더 작은 장치처럼 작동합니다. 하지만 여기서 뭘해야하는지 이해가 안 돼요. 점진적으로 더 높은 해상도를 위해 점진적으로 더 작은 이미지를 넣으면 실제로 큰 디스플레이에서는 좋지 않습니다. 아니면 내가 뭔가를 이해하지 못하고 있습니까?

어떤 포인터라도 대단히 감사하겠습니다.


25
"문제의 이미지는 2048x1066이고 제 일반 드로어 블 디렉토리에 있으므로 밀도에 관계없이이 이미지가 사용됩니다."- res/drawable/는 res/drawable-mdpi/. 밀도에 따라 이미지 크기를 조정하지 않으 려면 res/drawable-nodpi/또는을 사용하십시오res/drawable-anydpi/ .
— CommonsWare

3
"다양한 리소스 디렉토리에있는 100x100 픽셀 이미지가 실제로 레이아웃으로 넘어 가기 전에 다른 해상도의 가상 버전을 만들기 위해 크기가 조정된다는 말입니까?" -이는 보유하고있는 밀도와 실행중인 장치에 따라 다릅니다. 정확히 일치하는 항목이 있으면 아무것도 다시 샘플링되지 않습니다. 정확히 일치하지 않는 경우 주변 밀도의 이미지가 리샘플링됩니다. 따라서 res/drawable/foo.png(일명, res/drawable-mdpi/foo.png) 만 있고 장치가 xhdpi이면 이미지가 두 축을 따라 두 배가되어 4 배의 메모리를 차지합니다.
— CommonsWare

4
오류의 106975232 값은 이미지 해상도의 정확히 49x로 발생하며 두 축을 따라 7x 리샘플링을 의미합니다. 제가 예상했던 것보다 훨씬 높습니다. 아직 Android 7.0의 디스플레이 크기 설정을 사용할 기회가 없었기 때문에 계속 늘어나는 할 일 목록에 추가하겠습니다.
— CommonsWare

6
49x에 좋은 캐치! 왜 그렇게 높은지 설명 할 수있을 것 같아요. 그 숫자는 바이트라는 것을 명심하십시오. 이 이미지는 24 비트이지만 아마도 픽셀 당 32 비트로 읽혀질 것입니다. 그러면 메모리에서 8732672 바이트가되며, 이는 정확히 12.25 배로 들어가며, 이는 다시 각 축을 따라 3.5 배 확장됨을 의미합니다. 이 장치는 xxhdpi이므로 거의 옳은 것 같습니다. 어느 쪽이든 리소스가 그렇게 리샘플링 될 줄은 몰랐습니다. 도와 줘서 고마워! (그런데 이미지를 drawable-nodpi로 옮기면 실제로 문제가 해결됩니다.)
— Brian Rak

1
당신은 정말 요한의 답변을 받아 들여야한다
— S. 야곱 파월

답변:


167

필자의 경우 (고해상도) 스플래시 비트 맵을 drawable 에서 drawable-xxhdpi 로 이동하는 것이 해결책이었습니다.

나는 같은 문제가 있었다. 이 때문에 나는 문제가 내 시작 화면을 의심하지 않았다 되는 응용 프로그램이 시작될 때 표시하지만, 시작 화면이 문제가 밝혀졌다.

제 경우의 스플래시 화면에는 xxhdpi 해상도가 있으며 drawable-xxhdpi 대신 drawable 폴더 에 실수로 배치되었습니다 . 이로 인해 Android는 스플래시 화면에 mdpi 해상도가 있다고 가정하고 이미지를 필요한 크기의 3 * 3 배로 조정하고 비트 맵을 만들려고했습니다.


1
나는 추측하고 있습니다 : 그래서 안드로이드는 xxhdpi에서 hdpi로 이미지를 확장합니까? 예를 들어 3 * 3-> 1/1에서 1/3까지 말했듯이?
— 닌자 코딩

kalsara Magamage가 지적했듯이 이것은 이제 mipmap-xxhdpi입니다.
— Dana Robinson

37

android : 줄 사이에있는 Manifest 파일의 애플리케이션 태그에 아래 코드를 추가 한 후 문제를 해결했습니다 .

android:hardwareAccelerated="false"

3
글쎄, 몇 시간을 보낸 후이 솔루션은 xiaomi 및 Samsung 모바일 문제에 적용됩니다.
— Shihab Uddin

4
이렇게하면 CardView의 모든 고도가 비활성화됩니다. 따라서 적절한 해결책은 비트 맵을 더 작은 크기로 조정하는 것입니다.
— Sachin Soma

1
응용 프로그램 수준에서 하드웨어 가속을 비활성화하는 대신 Activity, Window, View 수준에서 제어하는 ​​것이 더 유용합니다.
— Mukhammadsher

1
그러나 android:hardwareAccelerated="false" . API 레벨이 22 미만인 일부 장치에서 이상한보기를 표시합니다.
— Prince Dholakiya

3
그렇게하지 마십시오. 앱 속도가 느려집니다.
— Curio

11

누군가에게 도움이 될지는 모르겠지만 여기에 남겨 두겠습니다. 제 경우에는 문제가 Android 7이 설치된 Sumsung 장치에서만 발생했으며 문제는 스플래시 화면 비율에있었습니다. 높이를 1024px로 변경 한 후-모든 것이 잘 작동합니다.


내 문제는 드로어 블 (접미사 없음) 폴더의 비트 맵 (jpg, png)이었습니다. 그것은 나의 어리 석음,하지만 어쩌면 누군가 :-)하는 데 도움이
— gingo

이것은 도움이됩니다! 같은 문제는 삼성 ... 먼저 무엇을 가지고 어떻게 고쳤습니까?
— M'hamed

URL에서 이미지를로드하려고 했습니까? Android 7의 Samsung Galaxy S6에서만 동일한 문제가 발생합니다. RecyclerView에서 이미지를로드하고 있습니다. 나는 아직도 이것을 알아낼 수 없다. @ M'hamed
— 로힛 싱

9

드로어 블의 이미지를 mipmap-xxhdpi로 이동합니다. 이미지는 비트 맵 형식이므로 이미지를 mipmap 폴더에 넣어야합니다.


1
AFAIK mipmap 폴더는 런처 아이콘 전용입니다. 다른 용도로는 사용한 적이 없습니다. 참조 stackoverflow.com/a/28065664/4034572
— 알버트 빌라 칼보

네 이것은 나를 위해 일했습니다. 나는 약 1MB의 이미지 크기를 가지고 있었고 그것들을 mipmap-xxhdpi에 넣었습니다


3

Picasso를 사용하면 Glide로 변경됩니다.

피카소 제거

Picasso.get().load(Uri.parse("url")).into(imageView)

글라이드 변경

Glide.with(context).load("url").into(imageView)

더 효율적


Picasso에서 Glide로 전환 한 후에도 여전히 오류가 발생합니다. 삼성 J6 전화에서. 그리고 Moto Z2 :(
— Rohit Singh

2

원본 비트 맵을 ImageViews, 사진 편집 앱 등에 그려야하는 몇 가지 시나리오가 있습니다.

위에서 언급 한 베이 설정

android:hardwareAccelerated="false"

잘못된 UI 경험을 유발할 것입니다. hardwareAccelerated 고해상도 이미지를 그릴 하나의 선택된 활동 만 설정할 수 있습니다.

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

0

아이콘 파일이 너무 커서 Android가 효율적이고 원활하게로드 할 수 없습니다. Android는 스마트 알고리즘으로이를 인식합니다.

asystat의 Final Android Resizer 를 사용하여 아이콘 파일의 크기를 조정할 수 있습니다 . "xhdpi"이하로 크기를 조정합니다.

크기가 조정 된 사진을 드로어 블에 배치하거나 기존의 큰 아이콘 파일을 덮어 씁니다.

그런 다음 끝났습니다.


0

글라이드를 사용하고 한 번에 1k 이미지 또는 일부 이미지를로드하는 경우 글라이드 또는 이미지보기를 설정하는 데 사용하는 모든 작업이 문제입니다. 글라이드에서 스케일 유형을 적용하여 해결할 수 있습니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.