Hab letztens die Beta zu meiner neuen App Crazy Bugs veröffentlicht
würde gerne wissen was ihr davon haltet -->
https://play.google.com/store/…ails?id=de.tec.web.nls.cb
würde mich über feedback bzw. Verbesserungsvorschläge freuen
Hab letztens die Beta zu meiner neuen App Crazy Bugs veröffentlicht
würde gerne wissen was ihr davon haltet -->
https://play.google.com/store/…ails?id=de.tec.web.nls.cb
würde mich über feedback bzw. Verbesserungsvorschläge freuen
Es lag daran dass Instant run irgendwie die Librarys als Daten gespeichert hat --> Inlant-Run ausgeschaltet dann hatte meine App selber mehr MB aber fast keine Daten mehr und der weise Bildschirm war auch weg.
Also meine App ist jetzt fast fertig aber das problem ist das immer wenn man sie zum erstmal öffnet (oder die Daten/cache löscht und dann öffnet) dann ist alles für erstmal 20 sek. weiß danach kann man sie schließen und neu öffnen ohne dass es so lange dauert. Wenn man bei App-Info schaut steht da dass die app Gesamt : 16,93MB, Anwendung : 5,84MB und Daten : 11,09MB ausserdem 24,77 MB Cache was mich verwundert sind die 11MB Daten bzw. 24MB cache weil ich nicht weiss woher die kommen.
Hat da jemand eine Ahnung oder braucht ihr vielleicht noch mehr infos zu irgendwas ?
Danke im voraus
Hi, also ich frage mich was der beste weg ist Wahrscheinlichkeit zu simulieren :
es gibt 3 Items : 1 das man mit einer Wahrscheinlichkeit von 70% ziehen kann 1 mit 20 und das andere mit 10%.
Ich würde jetzt einfach einen Random von 0-100 generieren und wenn random < 70 item 1 nehmen > 70 && < 90 usw..
oder gibt es noch andere bzw. bessere Wege die Wahrscheinlichkeit zu simulieren ?
Also jetzt funktioniert alles der erste Fehler war das ich makePurchase() gleich nach checkOwnedItems() aufgerufen habe obwohl der Prozess noch nicht abgeschlossen war :
can't start async operation (launchPurchaseFlow) because another async operation (refresh inventory) is in progress.
Dann habe ich makePurchase über einen Button aufgerufen es hat aber immer noch nicht funktioniert. Irgendwann fand ich heraus dass der listener nicht funktioniert hatte --> http://stackoverflow.com/a/14968203/4106137 das war die Antwort !
Ja das habe ich aber es funktioniert immer noch nicht : die checkOwnedItems() Methode funktioniert wie es aussieht da ich dann bei makePurchase(); (in try catch) eine Exception kriege :
can't start async operation (launchPurchaseFlow) because another async operation (refresh inventory) is in progress.
Daher vermute ich dass die Prozesse von checkOwnedItems() noch nicht abgeschlossen sind. (check owned items habe ich damit wenn ein Fehler unterläuft und dass item gekauft aber nicht wieder gelöscht wird am Anfang gleich wieder gelöscht wird). Aber wie kann ich tracken ob die Prozesse abgeschlossen sind ?
Ich versuche es jetzt mal mit getBuyIntent statt launchPurchaseFlow vielleicht funktioniert dass dann.
Hi,
Also ich versuche gerade In-App Billing V3 zu implementieren und habe es auch geschafft ein einmaligen kauf durchzuführen ---> (Test App) App öffnet sich Google Play "kauf Fenster" öffnet sich --> erfolgreicher kauf. Ich will aber dass die user unendlich viele coins kaufen können. Ich hab jetzt auch den code angepasst mit mHelper.consumeAsync(inventory.getPurchase("coins"), mConsumeFinishedListener); damit es wieder erhältlich ist (ist in allen tutorials so gemacht) aber an der App ändert sich nichts !!
Hier mal mein code (manche Kommentare sind noch aus TrivalDriver aus dem ich das meiste kopiert hab :
public class MainActivity extends AppCompatActivity {
IabHelper mHelper;
boolean verifyDeveloperPayload(Purchase p) {
String payload = p.getDeveloperPayload();
/*
* TODO: verify that the developer payload of the purchase is correct. It will be
* the same one that you sent when initiating the purchase.
*
* WARNING: Locally generating a random string when starting a purchase and
* verifying it here might seem like a good approach, but this will fail in the
* case where the user purchases an item on one device and then uses your app on
* a different device, because on the other device you will not have access to the
* random string you originally generated.
*
* So a good developer payload has these characteristics:
*
* 1. If two different users purchase an item, the payload is different between them,
* so that one user's purchase can't be replayed to another user.
*
* 2. The payload must be such that you can verify it even when the app wasn't the
* one who initiated the purchase flow (so that items purchased by the user on
* one device work on other devices owned by the user).
*
* Using your own server to store and verify developer payloads across app
* installations is recommended.
*/
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String base64EncodedPublicKey = "MY_KEY";
// compute your public key and store it in base64EncodedPublicKey
mHelper = new IabHelper(this, base64EncodedPublicKey);
mHelper.enableDebugLogging(true);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
// Oh no, there was a problem.
Log.d("TAG", "Problem setting up In-app Billing: " + result);
Log.i("TAG", "ERROR");
}
// Hooray, IAB is fully set up!
//check owned items & consum em
checkOwnedItems();
//make a test purchase
makePurchase();
}
});
}
private void makePurchase() {
try {
mHelper.launchPurchaseFlow(this, "coins", 10001, mPurchaseFinishedListener, "kp");
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
}
private void checkOwnedItems() {
try {
mHelper.queryInventoryAsync(mGotInventoryListener);
} catch (IabHelper.IabAsyncInProgressException e) {
//complain("Error querying inventory. Another async operation in progress.");
}
}
// Listener that's called when we finish querying the items and subscriptions we own
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
Purchase item = inventory.getPurchase("coins");
if (item != null && verifyDeveloperPayload(item)) {
//Log.d("TAG", "We have gas. Consuming it.");
try {
mHelper.consumeAsync(inventory.getPurchase("coins"), mConsumeFinishedListener);
} catch (IabHelper.IabAsyncInProgressException e) {
// complain("Error consuming gas. Another async operation in progress.");
}
return;
}
}
};
// Called when consumption is complete
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
public void onConsumeFinished(Purchase purchase, IabResult result) {
Log.d("TAG", "Consumption finished. Purchase: " + purchase + ", result: " + result);
// if we were disposed of in the meantime, quit.
if (mHelper == null) return;
// We know this is the "gas" sku because it's the only one we consume,
// so we don't check which sku was consumed. If you have more than one
// sku, you probably should check...
if (result.isSuccess()) {
// successfully consumed, so we apply the effects of the item in our
// game world's logic, which in our case means filling the gas tank a bit
//Log.d(TAG, "Consumption successful. Provisioning.");
//mTank = mTank == TANK_MAX ? TANK_MAX : mTank + 1;
// saveData();
// alert("You filled 1/4 tank. Your tank is now " + String.valueOf(mTank) + "/4 full!");
}
else {
//complain("Error while consuming: " + result);
}
Log.d("TAG", "End consumption flow.");
}
};
// Callback for when a purchase is finished
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d("TAG", "Purchase finished: " + result + ", purchase: " + purchase);
// if we were disposed of in the meantime, quit.
if (mHelper == null) return;
if (result.isFailure()) {
// complain("Error purchasing: " + result);
return;
}
if (!verifyDeveloperPayload(purchase)) {
// complain("Error purchasing. Authenticity verification failed.");
return;
}
Log.d("TAG", "Purchase successful.");
if (purchase.getSku().equals("coins")) {
Log.d("TAG", "Purchase is gas. Starting gas consumption.");
try {
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
} catch (IabHelper.IabAsyncInProgressException e) {
//complain("Error consuming gas. Another async operation in progress.");
return;
}
}
}
};
@Override
public void onDestroy() {
super.onDestroy();
if (mHelper != null) try {
mHelper.dispose();
} catch (IabHelper.IabAsyncInProgressException e) {
e.printStackTrace();
}
mHelper = null;
}
}
Alles anzeigen
Danke für Antworten
Ok danke das hate ich auch schon gemacht aber hatte vermutlich ein paar Methoden vergessen/nicht richtig umgesetzt. Dann lese ich mir jetzt erstmal die Dokumentation durch und versuch es nochmal.
Genauso, diese klasse sollte dabei aber parcelable sein.
Ja genau darauf bin ich auch schon gestossen aber ich weiss nicht wie man die klasse parcelable machen kann... hab auch schon ein paar versuche gemacht aber hat nie funktioniert.
Hi,
Ich weiss jetzt zwar wie ich Strings, Booleans etc... übergeben kann (mit intent.putExtra) aber ich muss dem Service eine Klasse übergeben weiss jemand wie das gehen könnte ?
In der for schleife wird als erstes ein wert initialisiert z.B int i = 0; als zweites wird die Bedingung das die Schleife ausgeführt wird festgelegt z.B. i < 10. Als letztes wird festgelegt was mit dem initialisierten wert (i) jeden durchlauf gemacht wird z.B. i++ (i+1).
Beispiel :
int kp = 10;
for (int i = 0; i<kp; i++){
//dieser code wird 10x wiederholt
}
Ah ok.
Vielen Dank
Ok und was sind das dann für Nachrichten weil ich muss variablen und classen übergeben.
Hi,
Also ich starte in meiner main classe einen Service über einen Intent. Mein problem ist nun dass ich nicht weiss wie ich jetzt mit dem service kommunizieren kann :
also z.B auf eine public Methode zugreifen.
Weiss jemand wie das gehen könnte ?
Danke im Voraus
Hi,
Also ich mach grad nen Spiel in dem man items erhalten kann die dann in ein Inventar kommen. Was ist der beste weg diese zu speichern ?
Danke im Voraus
Alles anzeigenIch wüsste nicht wie das gehen sollte, dass man eine Bitmap die in einer erstellten View existiert mit einem listener versehen kann.....
Wenn ich mit den vorhandenen MotionEvents arbeite bekomme ich es nicht hin, dass er erkennt ob ich es gedrückt halte und wann ich es loslasse (Szenario: pressed & released)
Mit dem MotionEvent.ACTION_UP ist die Zeitspanne zwischen DOWN und UP ne millisekunde, also nicht sehbar.
CodeAlles anzeigen@Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); int x = (int) event.getX(); // or getRawX(); int y = (int) event.getY(); switch(action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: if ((x >= button_right_X) && (x < (button_right_X + button_right.getWidth())) && (y >= button_right_Y) && (y < (button_right_Y + button_right.getHeight()))) { Log.d("asd", "geklickt Rechts"); GameHandler.run(0); } break; } return false; }
(button_right ist eine Bitmap)
ersetz return false durch returne true;
Also du kannst ein Rechteck auf den Canvas zeichnen (muss grösser als er sein wenn du scrollen willst) und machst dann in onTouch ein switch case wo du deine Finger "Start" Position also da wo der Touch angefangen hat in Action_Down deklarierst. In Action_Move subtrahierst du dann einfach die aktuelle Finger Possition mit der anfangs Position so erhältst du die "Strecke" die der Finger zurück legt. Auch in Action_move addierst du diese Strecke dann an die Seiten. In Action_Down löschst du wieder den Start wert.
(die Finger Position kriegst du mit event.getX o Y)
Und was kann ich machen wenn ich will dass ein Bild den Bildschirm in der breite perfekt füllt weil es gibt ja extrem, viele verschiedene Breiten und Höhen bei Android Geräten da hilft drawable-small, -normal, etc nicht mehr.
Also jetzt ohne Image Asset.