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.