Mam dzisiaj mały brain-fck z dokumentacją Androida. Pytanie pod sam koniec, reszta to żale i rozwinięcie problemu :).
Chcę dodać do swojej aplikacji dzielenie się zrzutem ekranu telefonu/aplikacji.
Do tworzenia grafów z informacjami używam biblioteki GraphView (już przerobionej na moje potrzeby pod względem sposobu wyświetlania treści)
http://www.android-graphview.org/
https://github.com/appsthatmatter/GraphView
W tym celu mógłbym zapisać ekran jako bitmapę (mały wycinek z kodu) np.
private Bitmap takeScreenShot(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas();
canvas.setBitmap(bitmap);
view.draw(canvas);
return bitmap;
}
gdzie View to:
View view = getActivity().getWindow().getDecorView();
lub
View view = getView();
nie wnikam, nie mogę sprawdzić który by działał
albo wszelkiego rodzaju kombinacje z drawing cache :
public void postPicture(Activity activity) {
...
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap b1 = view.getDrawingCache();
....
view.destroyDrawingCache();
}
Problem pojawia się w momencie, gdy następuje próba przerysowania elementu z biblioteki GraphView która jest częścią View
GraphView wymaga włączonego hardwareacceleration. Error jest niby jasny i podpowiada też rozwiązanie.
java.lang.IllegalStateException: GraphView must be used in hardware accelerated mode.You can use android:hardwareAccelerated="true" on your activity
Po spędzeniu całego dnia na różnego rodzaju próbach ustawiania hardware acceleration dla aktywności, fragmentów, pojedynczych view, podglądania w debuggerze czy mają włączone "ha" czy nie, w jakim momencie się to dzieje itp. doszedłem do wniosku, że wina wcale nie leży po stronie aktywności/widoku.
W powyższej bibliotece odnalazłem miejsce wyrzucające błąd:
if (android.os.Build.VERSION.SDK_INT >= 11 && !canvas.isHardwareAccelerated()) {
throw new IllegalStateException(...);
}
Huh, dobry trop. No to source code androida (klasa Canvas.java), i mam:
/**
* Indicates whether this Canvas uses hardware acceleration
* Note that this method does not define what type of hardware acceleration
* may or may not be used.
* @return True if drawing operations are hardware accelerated, false otherwise.
*/
public boolean isHardwareAccelerated() {
return false;
}
Dziękuję, do widzenia. Czy ja czegoś tutaj nie rozumie? Zastanawiam się, kiedy w ogóle ten warunek nie byłby spełniony (SDK < 11 było kilka lat temu).
Biblioteka jest otwarta i zastanawiam się, czy czasem po prostu nie wywalić tego warunku (chyba jedyne rozwiązanie).
Chyba, że da się użyć jakiegoś innego obiektu jako Canvas i przypisać hardware acceleration?