رفتن به مطلب

محمدرضا شاهپیری

مدیر کل سایت
  • تعداد ارسال ها

    4,152
  • تاریخ عضویت

  • آخرین بازدید

  • روز های برد

    831

تمامی مطالب نوشته شده توسط محمدرضا شاهپیری

  1. الان مشکل فقط روی Release (obfuscated) هست یا روی Release هم خطا میده؟
  2. سلام و درود من رو اندروید 14 تست کردم موردی نبود. چک کنید حتما مایکت روی گوشیتون به روز باشه و کامپایل رو روی ریلیز بزارید نه دیباگ
  3. سلام و درود. محصول توی لیست خریدتون هست دوست عزیز. از منوی بالای انجمن قسمت فروشگاه -> مدیریت خریدها دانلود کنید
  4. من مجددا تست کردم همچین مشکلی وجود نداره و مقدار payload درست ذخیره میشه
  5. پیاده سازی خاصی نداره. شما یه gridview دارین که مثلا 3 تا ستون داره میخواین شامل عکس و ویدئو. میخواین ویدئو دوبرابر عکس باشه. Private Sub EventName_getSpanSize(position as int) as int dim item as Item=items.get(position) if item.isVideo then return 2 else return 1 End Sub در واقع خروجی این تابع نسبت به کل هست.اگه 2 باشه یعنی دو سوم صفحه یا اگه 3 باشه یعنی کل صفحه. پیاده سازی کنید متوجه میشید
  6. خب اشتباه شما همین جاس.تابع init برای راه اندازی هست و متغیر دوم eventName هست نه payload تابع خرید به شکل زیر هست و اینجا متغیر دوم payload هست poolakey.purchaseProduct("product_id","payload")
  7. سلام و درود. باید از spanSize استفاده کنید متد زیر رو پیاده کنید مثلا اگه سه ردیف دارین حداکثر مقدار خروجی 3 هست که میشه کل صفحه. Private Sub EventName_getSpanSize(position as int) as int End Sub
  8. سلام و درود. من متوجه مشکل نشدم دوستان. من تو پنل بازار خودم نگاه میکنم مشکلی نمیبینم و مقدار payload عینا ذخیره میشه. مسیر رو چجوری دارین میرین؟
  9. سلام نیازی به فایلهای sdk نیست. نسخه آخر رو از سایت مرجع دانلود کنید نباید مشکلی باشه
  10. عالی و کامل. ممنون که به اشتراک گذاشتین
  11. ببینید عزیز من ایده کلی رو بهتون میدم شما دیگه خودتون تکمیلش کنید و بالا پایین کردناشو انجام بدین اول یه کلاس به اسم Payment ایجاد کنید Sub Class_Globals Private poolakey As Poolakey Private myketBill As MyketBilling Private eventName As String="billing" Private publicKey As String="......." Private market As String Private connected As Boolean=False Private module As Object End Sub Public Sub Initialize(mMarket As String,mModule As Object) market=mMarket module=mModule If market="bazaar" Then setupPoolakey Else setupMyket End If End Sub Private Sub setupPoolakey poolakey.init(publicKey,eventName) poolakey.connect End Sub Private Sub setupMyket myketBill.initialize(eventName,publicKey) End Sub Public Sub purchase(productId As String,payload As String) If connected==False Then ToastMessageShow("ارتباط با مارکت برقرار نشد",False) Return End If If market="bazaar" Then poolakey.purchaseProduct(productId,payload) Else myketBill.launchPurchaseFlow(productId,payload) End If End Sub Private Sub billing_connectionSucceed connected=True End Sub Private Sub billing_onIabSetupFinished(result As IabResult) connected = result.isSuccessful End Sub Private Sub billing_purchaseSucceed(purchaseInfo As PurchaseInfo) CallSubDelayed3(module,"handlePurchase",True,purchaseInfo.purchaseToken) End Sub Private Sub billing_purchaseFailed(error As String) CallSubDelayed3(module,"handlePurchase",False,Null) End Sub Private Sub billing_onIabPurchaseFinished(r As IabResult,p As Purchase) CallSubDelayed3(module,"handlePurchase",r.isSuccessful,p.Token) End Sub حالا کافیه توی اکتیویتی به شکل زیر استفاده کنید Dim paymant As Payment paymant.Initialize("bazaar",Me) paymant.purchase("productId","payload") Public Sub handlePurchase(success As Boolean,token As String) End Sub
  12. اصولا وقتی اینجور سیستمی دارین که چند نوع مختلف از یک عملیات یکسان رو توش انجام میدین (مثلا پرداخت درون برنامه ای دوتا مارکت متفاوت) باید یه کلاس واسط بنویسید و توش متدهای و ایونتهای پرداخت رو پیاده کنید و شما فقط با این کلاس باید حرف بزنید و مهم نباشه چه مارکتی استفاده میکنید خوب میشه حال دل مردم بالاخره عزیز. روزها و دوران سخت تر از این هم بوده و رفته. این روزام میگذره...
  13. سلام ودرود. سن یه عدده عزیز دلت باید جوون باشه اما در مورد مشکل، ببینید بیس کتابخونه های درون پرداخت یکیه و همشون از کلاسهای گوگل استفاده میکنن.حالا وقتی میاید و دوتاشونو استفاده میکنید کلاس تکراری به وجود میاد. اندریوداستودیو اینو هندل میکنه اما b4a متاسفانه توی کامپایل خیلی ضعیفه و هیچ آپشنی نمیده. تنها راهش اینه که یکی از اونها رو توی پروژه داشته باشید و با استفاده از آبسترکشن کلاسهای جداگونه بنویسید که غیر فعال کردن کتابخونه راحت باشه.
  14. سلام و درود. پیشنهاد میشه که به جای fastnet از رتروفیت استفاده کنید. اما در مورد سوال بله کافیه از فایل xml کتابخونه okhttputils وابستگی okhttp رو حذف کنید
  15. سلام و درود. پست ویرایش شد و سورس هم جهت راحتی کار پیوست شد.
  16. کتابخونه داره درست کار میکنه عزیز چون اون خطا از سرور داره میاد یعنی اینکه ارتباط با سرور برقرار شده.منم دوباره تست کردم و موردی نبود. حالا باید ببینید چرا این پیغام رو میده شاید مقادیر رو دارین اشتباه میفرستین. سورس رو بدون هیچ تغییری رو یه گوشی دیگه هم تست کنید و ایمیل معتبر وارد وارد کنید ببینید چی میشه. در صورت امکان فایل apk رو بزارید که من تست کنم
  17. اگه نیاز بود توضیح میدادیم. تو سورس توکن هست و کار میکنه و سورس رو ران کنید میتونید استفاده کنید. صرفا اگه بخواید با توکن شخصی کار کنید نیازه مراحل بالا رو طی کنید. آموزشهای لازم برای کتابخونه چه متنی و چه تصویری موجوده. شما اگه php داشتین که با کتاخونه های دیگه کار میکرده با این هم کار میکنه. لطفا ادامه سوالات در مورد مشکلات و مسائل مربوط به کتابخونه باشه نه آموزش php یا موارد دیگه. موفق باشید.
  18. چه خطایی میده متن خطا یا اسکرین بزارید
  19. وارد سایت زیر بشید و لاگین کنید. https://gorest.co.in/consumer/login مطابق صفحه زیر توکن رو بگیرید توکن رو طبق شکل زیر جایگزین کنید توی کلاس PrRetrofit و متد retrofit_intercept دقت کنید توکن باید همراه Bearer و یه فاصله باشه دقیقا مطابق سورس. دیگه نباید مشکلی باشه
  20. من فعلا وقت نمیکنم دوست عزیز تا آخر ماه شاید سرم خلوت شه. تو نت سرچ کنید آموزش زیاد هست.
  21. من php کار نکردم دوست عزیز فقط در حد مقدماتی. برای وب سرویس نوشتن پایتون گزینه فوقلاده ای هست و خیلی راحت و سریع میتونید بک اند اپ رو پیاده کنید. اگه خودتون بلد نیستید حتما به یه api نویس و وب کار بدین بنویسه
  22. سلام و درود. api هایی که تو آموزش استفاده شده با پایتون-جنگو نوشته شده که تو پنل قرار گرفت. درمورد اتصال به اینترنت هم تو انجمن تاپیک زیاد هست در موردش جستجو کنید پیدا میکنید
  23. بله دوست عزیز. کرش میکنه. این کلاسها نیاز هست برای کتابخونه
  24. سلام و درود. امیدوارم حالتون خوب باشه از بین چهار کامپوننت اصلی اندروید رسیورها یکی از مهمترینهاش هست. از اونها برای اسال رویداد بین برنامه ها و یا بین خود کامپوننتها استفاده میشه. همینطور برای دریافت اعلانهای سیستمی مثل اس ام اس یا تماس ازشون استفاده میشه. این قابلیت جدیدا به صورت نیتیو به b4a اضافه شده هر چند کامل این کار رو نکرده. بریم که ببینیم به چه شکل باید استفاده کنیم. اول از منوی Project->Add New Module->Receiver Module یه رسیور مثلا به نام TestReceiver ایجاد میکنیم. Sub Process_Globals End Sub Private Sub Receiver_Receive (FirstTime As Boolean, StartingIntent As Intent) Log(StartingIntent.Action) End Sub به طور کلی به دو صورت میتونیم رسیورها رو توی اندروید ثبت کنیم. 1- از طریق منیفست یا استاتیک: یکی از روشهای ثبت رسیور از طریق منیفست هست. البته این روش برای اکثر اعلانها تو نسخه های جدید اندروید غیر فعال شده. مثلا میخوایم بوت شدن دستگاه رو بفهمیم. به منیفست کدهای زیر رو اضافه میکنیم. AddPermission(android.permission.RECEIVE_BOOT_COMPLETED) AddReceiverText(TestReceiver, <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter>) 2-از طریق کدنویسی یا داینامیک: اینجا رو دیگه ارل یادش رفته و براش راه حلی نزاشته. ولی ما که نمیزاریم چیزی لنگ بمونه این روش روش پیشنهادی و استاندارد گوگل هست. کدهای زیر رو به اکتیوتی یا سرویس اضافه کنید اضافه کنید. #If java import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.os.Build; import java.lang.reflect.Constructor; public void registerReceiver(Object receiverClass, String[] actions) throws Exception{ IntentFilter intentFilter=new IntentFilter(); for (String action:actions) { intentFilter.addAction(action); } String className=receiverClass.toString().replace("class ",""); Class<?> clazz = Class.forName(className); Constructor<?> cons = clazz.getConstructor(); cons.setAccessible(true); final BroadcastReceiver receiver =(BroadcastReceiver) cons.newInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { registerReceiver(receiver,intentFilter,Context.RECEIVER_EXPORTED); }else { registerReceiver(receiver,intentFilter); } } public void unregisterReceiver(Object receiverClass) throws Exception{ String className=receiverClass.toString().replace("class ",""); Class<?> clazz = Class.forName(className); Constructor<?> cons = clazz.getConstructor(); cons.setAccessible(true); BroadcastReceiver receiver =(BroadcastReceiver) cons.newInstance(); unregisterReceiver(receiver); } #End If و به صورت زیر رسیور رو ثبت کنید. مثلا میخوایم هر وقت دقیقه گوشی عوض شد متوجه بشیم. Dim jo As JavaObject jo.InitializeContext.RunMethod("registerReceiver",Array(TestReceiver,Array As String("android.intent.action.TIME_TICK"))) این مواردی که تا الان عرض شد برای اعلانهای سیستمی هست، اما یکی از مهمترین قابلیتهای رسیور اینه که ما میتونیم رسیور دلخواه خودمونو هم ثبت کنیم که خب خیلی کاربردی هست. مثلا میخوایم یه اعلان با اکشن com.action.TEST ثبت کنیم. به صورت زیر ثبتش میکنیم Dim jo As JavaObject jo.InitializeContext.RunMethod("registerReceiver",Array(TestReceiver,Array As String("com.action.TEST"))) و حالا برای صدا زدن اعلان به شکل زیر عمل میکنیم. اول کتابخونه phone رو تیک میزنیم. Dim phone As Phone Dim i As Intent i.Initialize("com.action.TEST","") i.PutExtra("key","value") phone.SendBroadcastIntent(i) حتما توجه داشته باشین که بعد از استفاده اونو unregister کنید.به شکل زیر Dim jo As JavaObject jo.InitializeContext.RunMethod("unregisterReceiver",Array(TestReceiver,Null)) سورس هم پیوست شد receiver.zip مانا باشید
×
×
  • اضافه کردن...