From the wink I guess it's already on your to-do list...
Coder, video game industry veteran (since the '80s, ❤'s assembler), arrested - never convicted hacker (in the '90s), dad of five, he/him (if that even matters!). https://deluxepixel.com
" allow premium developers access to crash reports of their apps, including Lua errors, so app developers could also identify problems and fix them easily in one place"
"premium" <- Do you mean Indie or Pro (hopefully you mean Indie)...
Coder, video game industry veteran (since the '80s, ❤'s assembler), arrested - never convicted hacker (in the '90s), dad of five, he/him (if that even matters!). https://deluxepixel.com
Crash reporting is a curious feature. Why not just make plugins for some of the feature rich services that already exist like Crashlytics or New Relic? Bowerhaus' iOS plugin is around 60 lines of code and works quite well.
1) Crash reporting is mostly meant for our internal use, to find and fix bugs in Gideros, sharing it with developers is just a bonus 2) Reporting some of our needed stuff like Gideros specific data or for example Lua errors is not so easy, @bowerandy basically hacked his way around and it seems it still has some problems 3) Being tied to a specific service provider is always a risk, firstly there might be additional costs, and also platform dependency, when we introduce new platform which the service provider won't support, we would either have to split to different services or move to other service altogether. 4) Handling our own data gives us flexibility to for example integrate it in internal bug tracker and lots of other fun stuff
Based on these reasons we decided to try out and do it ourselves
Is this crash happens because of new crash report system?
com.github.anrwatchdog.ANRError: Application Not Responding at java.lang.BootClassLoader.getInstance(ClassLoader.java:1011) at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:385) at java.lang.ClassLoader.loadClass(ClassLoader.java:541) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at dalvik.system.DexFile.defineClass(Native Method) at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:207) at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:200) at java.lang.ClassLoader.loadClass(ClassLoader.java:551) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.Class.getDeclaredMethods(Native Method) at java.lang.ClassCache.getDeclaredPublicMethods(ClassCache.java:153) at java.lang.ClassCache.getMethodsRecursive(ClassCache.java:216) at java.lang.ClassCache.findMethods(ClassCache.java:175) at java.lang.ClassCache.getMethods(ClassCache.java:167) at java.lang.Class.getMethod(Class.java:961) at com.giderosmobile.android.player.GiderosApplication.executeMethod(GiderosApplication.java:91) at com.giderosmobile.android.player.GiderosApplication.onCreate(GiderosApplication.java:296) at com.giderosmobile.android.sostavslovo2Activity.onCreate(sostavslovo2Activity.java:82) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) at android.app.ActivityThread.access$1500(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3687) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) at dalvik.system.NativeStart.main(Native Method)
Using same interface across all supported Operating systems
Using same interface across all supported controllers
Support for multiple controller types on same market/device (As playing with Xbox or Moga controller on OUYA)
Easier additions of support for future controllers
Providing controller layer, which would easily allow you to combine gameplay with or without controllers in the same app
Controller layer would easily allow you to port your touch based interface (as menu buttons) to controller selectable buttons
From now we will try adding in-app purchases to IAB interface, controller support to Controller interface, thus eliminating the separate plugin for OUYA, GameStick and alike platforms
@ar2rsawseen I tried the media plug-in on our 'baseline' device (HTC Legend, which is Android 8). However, on either media:getPicture() or media:takePicture(), the gideros player app crashes with these errors: 01-20 10:18:04.435: I/WindowManager(99): WIN DEATH: Window{45041b28 SurfaceView paused=false} 01-20 10:18:04.435: I/ActivityManager(99): Process com.chainelsbv.androidplayer (pid 5549) has died. 01-20 10:18:04.445: E/ActivityManager(99): fail to set top app changed! 01-20 10:18:04.445: I/WindowManager(99): WIN DEATH: Window{4500ff70 com.chainelsbv.androidplayer/com.giderosmobile.android.CHAINelsActivity paused=false} What's happening? A call to media:isCameraAvailable() is working fine...
Updated Media plugin, lots of changes, basically separated them in two classes and added functionalities, like taking screenshot, playing video files for cutscenes, getting/setting pixel values, etc
require "media" -- initialize plugin
MediaManager class
Methods
mediamanager:isCameraAvailable() -- returns true is you can get picture from camera
mediamanager:takePicture() -- allow user to provide picture input from camera
mediamanager:getPicture() -- allow user to select picture from gallery
mediamanager:takeScreenshot() -- capture the screenshot of the app
mediamanager:postPicture(path) -- add picture from given path to gallery (or open save file dialog on pc)
mediamanager:playVideo(path, force) -- play vieo file in given path (bool force to watch till the end, or quit playing on tap)
Events
Event.MEDIA_RECEIVE --user selected image
e.path -- path to image
Event.MEDIA_CANCEL --user canceled media input
Event.VIDEO_COMPLETE --user completed watching video
Media class
Media.new(path) -- create new Media object with provided image
Media:getPath() -- returns the path that was used to create object
Media:getWidth() -- returns the width of the image
Media:getHeight() -- returns the height of the image
Media:getPixel(x, y) -- returns r, g, b, a values of pixel at x,y coordinate
Media:setPixel(x, y, r, g, b, a) -- sets r, g, b, a values to pixel at x,y coordinate
Media:resizeWidth(path, newWidth) -- resize image proportionally to new width
Media:resizeHeight(path, newHeight) -- resize image proportionally to new height
Media:resize(path, newWidth, newHeight, crop) -- resize image proportionally to new width and new height
if crop is true, maximal possible area of picture will be cropped to suit new dimensions
if crop is false, then image will be resized to maximum dimensions to fit in the provided rectangle
Media:crop(path, x, y, width, height) -- crop with and height from x and y point from a given image
Media:copy(source, destination) -- make a copy of the image
-perhaps some way to import/export a whole folder? getDir() e.g. getPictureDir() would ask the player to navigate to a folder and then all the images in it would be sent back to the app (of course loading all of them is slow and not needed, a list of the locations would be enough); edit: once the folder is given it's easy to sweep it with lfs or something, as i remember. still, a getDir() function would be good which allows the player to navigate to a directory. this we could use also to store data in a place chosen by the user. simply in settings there could be a 'set custom directory for save games/data whatever' and then pressing the button would call this getDir()
[-finally a Media:getPictureFromFile(location) to read all of these one-by-one would be handy. edit: Media.new(path) is exactly this as now i notice. right?]
-mediamanager:postPicture(path) corresponds to sharing or it's different? if different, then a sharePicture() function would be also good.
-also i don't see, can we make a Media too? i mean can we export to a file something made by rendertotexture?
- the getPicture() feature could be much more general, e.g. getFile("xyz") would open a file chooser where the user can select a file with extension "xyz" and the return value would be the path to this file. of course it won't look in the gallery but in the file structure. (assuming all os's have a native file chooser dialog, which i don't know, but would be logical).
It might be better to have it so it grabs/loads to a texture then have the resize commands added to the texture system (so you could then also resize textures). The same with play video - have it go direct to a texture location as it plays - you could then scale it, fly it around the screen, etc...
Coder, video game industry veteran (since the '80s, ❤'s assembler), arrested - never convicted hacker (in the '90s), dad of five, he/him (if that even matters!). https://deluxepixel.com
Comments
Likes: SinisterSoft
https://deluxepixel.com
http://giderosmobile.com/labs/ouya
Likes: SinisterSoft
https://play.google.com/store/apps/developer?id=My+name+is+Originality
http://giderosmobile.com/labs/gideros
So I've added an addition to Android project, which would report crashes to Gideros server.
Soon to be available also for iOS.
More information available here:
http://giderosmobile.com/labs/gideros-reporting
Likes: SinisterSoft
"premium" <- Do you mean Indie or Pro (hopefully you mean Indie)...
https://deluxepixel.com
@unlying yes we have few
Likes: SinisterSoft
Author of Learn Lua for iOS Game Development from Apress ( http://www.apress.com/9781430246626 )
Cool Vizify Profile at https://www.vizify.com/oz-apps
Let me create a web based crash report browsing
Google Play: https://play.google.com/store/apps/details?id=com.Mithrilsoft.Fourfold
Google Plus: https://plus.google.com/117851645612711931372
Twitter: https://twitter.com/mithrilsoft
2) Reporting some of our needed stuff like Gideros specific data or for example Lua errors is not so easy, @bowerandy basically hacked his way around and it seems it still has some problems
3) Being tied to a specific service provider is always a risk, firstly there might be additional costs, and also platform dependency, when we introduce new platform which the service provider won't support, we would either have to split to different services or move to other service altogether.
4) Handling our own data gives us flexibility to for example integrate it in internal bug tracker and lots of other fun stuff
Based on these reasons we decided to try out and do it ourselves
com.github.anrwatchdog.ANRError: Application Not Responding
at java.lang.BootClassLoader.getInstance(ClassLoader.java:1011)
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:385)
at java.lang.ClassLoader.loadClass(ClassLoader.java:541)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at dalvik.system.DexFile.defineClass(Native Method)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:207)
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:200)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.Class.getDeclaredMethods(Native Method)
at java.lang.ClassCache.getDeclaredPublicMethods(ClassCache.java:153)
at java.lang.ClassCache.getMethodsRecursive(ClassCache.java:216)
at java.lang.ClassCache.findMethods(ClassCache.java:175)
at java.lang.ClassCache.getMethods(ClassCache.java:167)
at java.lang.Class.getMethod(Class.java:961)
at com.giderosmobile.android.player.GiderosApplication.executeMethod(GiderosApplication.java:91)
at com.giderosmobile.android.player.GiderosApplication.onCreate(GiderosApplication.java:296)
at com.giderosmobile.android.sostavslovo2Activity.onCreate(sostavslovo2Activity.java:82)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
http://giderosmobile.com/labs/controller
More information:
http://docs.giderosmobile.com/interface/controller
What Controller Interface provides:
Likes: SinisterSoft, Mells
Likes: SinisterSoft
http://giderosmobile.com/labs/media
API Reference
Methods
Events
Likes: chipster123, vitalitymobile, SinisterSoft, unlying, ArtLeeApps, talis, zoolax, seppsepp, Holonist
Thanks again.
01-20 10:18:04.435: I/WindowManager(99): WIN DEATH: Window{45041b28 SurfaceView paused=false}
01-20 10:18:04.435: I/ActivityManager(99): Process com.chainelsbv.androidplayer (pid 5549) has died.
01-20 10:18:04.445: E/ActivityManager(99): fail to set top app changed!
01-20 10:18:04.445: I/WindowManager(99): WIN DEATH: Window{4500ff70 com.chainelsbv.androidplayer/com.giderosmobile.android.CHAINelsActivity paused=false}
What's happening? A call to media:isCameraAvailable() is working fine...
But I will get an Android 2.2 and try it out (currently testing with 2.3 and it works)
MediaManager class
Methods
Events
Media class
-perhaps some way to import/export a whole folder? getDir()
e.g. getPictureDir() would ask the player to navigate to a folder and then all the images in it would be sent back to the app (of course loading all of them is slow and not needed, a list of the locations would be enough); edit: once the folder is given it's easy to sweep it with lfs or something, as i remember. still, a getDir() function would be good which allows the player to navigate to a directory. this we could use also to store data in a place chosen by the user. simply in settings there could be a 'set custom directory for save games/data whatever' and then pressing the button would call this getDir()
[-finally a Media:getPictureFromFile(location) to read all of these one-by-one would be handy. edit: Media.new(path) is exactly this as now i notice. right?]
-mediamanager:postPicture(path) corresponds to sharing or it's different? if different, then a sharePicture() function would be also good.
-also i don't see, can we make a Media too? i mean can we export to a file something made by rendertotexture?
Fragmenter - animated loop machine and IKONOMIKON - the memory game
-a function that converts a list of images into video (avi, mp4, whatever) with a given framerate.
Fragmenter - animated loop machine and IKONOMIKON - the memory game
getFile("xyz") would open a file chooser where the user can select a file with extension "xyz" and the return value would be the path to this file. of course it won't look in the gallery but in the file structure. (assuming all os's have a native file chooser dialog, which i don't know, but would be logical).
Fragmenter - animated loop machine and IKONOMIKON - the memory game
https://deluxepixel.com