Android, screenshot, error

0

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?

0

Dzięki za odpowiedź.
Śmieszna sprawa, że sam znalazłem z 15 min temu ;).

Mimo wszystko, miło byłoby gdyby dało się przypisywać do Canvas wspomaganie ręcznie i nie byłoby tego rodzaju problemów.

Edit. Sprawdziłem rozwiązanie i daję sobie z tym spokój. Nie warto marnować czasu.
klasa View gryzie się z ręcznym nadpisaniem hardware acceleration w Canvas... nieważne skąd bym nie wywołał rozwiązania z linka którego podałeś, skutkuje to:

 java.lang.ClassCastException: pl.xxx.app.recordingsession.RecordingSessionFragment$1 cannot be cast to android.view.HardwareCanvas

Tak więc screenów nie będzie, przynajmniej dopóki nie będzie jakiegoś bug-fix dla tej biblioteki. Albo pomyślę o zastosowaniu innej do rysowania grafów.

0

No to polecam MpAndroidChart

1 użytkowników online, w tym zalogowanych: 0, gości: 1