رفتن به مطلب

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

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

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

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

  • روز های برد

    772

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

  1. سلام و درود. محصول توی لیست خریدتون هست دوست عزیز. از منوی بالای انجمن قسمت فروشگاه -> مدیریت خریدها دانلود کنید
  2. من مجددا تست کردم همچین مشکلی وجود نداره و مقدار payload درست ذخیره میشه
  3. پیاده سازی خاصی نداره. شما یه 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 باشه یعنی کل صفحه. پیاده سازی کنید متوجه میشید
  4. خب اشتباه شما همین جاس.تابع init برای راه اندازی هست و متغیر دوم eventName هست نه payload تابع خرید به شکل زیر هست و اینجا متغیر دوم payload هست poolakey.purchaseProduct("product_id","payload")
  5. سلام و درود. باید از spanSize استفاده کنید متد زیر رو پیاده کنید مثلا اگه سه ردیف دارین حداکثر مقدار خروجی 3 هست که میشه کل صفحه. Private Sub EventName_getSpanSize(position as int) as int End Sub
  6. سلام و درود. من متوجه مشکل نشدم دوستان. من تو پنل بازار خودم نگاه میکنم مشکلی نمیبینم و مقدار payload عینا ذخیره میشه. مسیر رو چجوری دارین میرین؟
  7. سلام نیازی به فایلهای sdk نیست. نسخه آخر رو از سایت مرجع دانلود کنید نباید مشکلی باشه
  8. عالی و کامل. ممنون که به اشتراک گذاشتین
  9. ببینید عزیز من ایده کلی رو بهتون میدم شما دیگه خودتون تکمیلش کنید و بالا پایین کردناشو انجام بدین اول یه کلاس به اسم 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
  10. اصولا وقتی اینجور سیستمی دارین که چند نوع مختلف از یک عملیات یکسان رو توش انجام میدین (مثلا پرداخت درون برنامه ای دوتا مارکت متفاوت) باید یه کلاس واسط بنویسید و توش متدهای و ایونتهای پرداخت رو پیاده کنید و شما فقط با این کلاس باید حرف بزنید و مهم نباشه چه مارکتی استفاده میکنید خوب میشه حال دل مردم بالاخره عزیز. روزها و دوران سخت تر از این هم بوده و رفته. این روزام میگذره...
  11. سلام ودرود. سن یه عدده عزیز دلت باید جوون باشه اما در مورد مشکل، ببینید بیس کتابخونه های درون پرداخت یکیه و همشون از کلاسهای گوگل استفاده میکنن.حالا وقتی میاید و دوتاشونو استفاده میکنید کلاس تکراری به وجود میاد. اندریوداستودیو اینو هندل میکنه اما b4a متاسفانه توی کامپایل خیلی ضعیفه و هیچ آپشنی نمیده. تنها راهش اینه که یکی از اونها رو توی پروژه داشته باشید و با استفاده از آبسترکشن کلاسهای جداگونه بنویسید که غیر فعال کردن کتابخونه راحت باشه.
  12. سلام و درود. پیشنهاد میشه که به جای fastnet از رتروفیت استفاده کنید. اما در مورد سوال بله کافیه از فایل xml کتابخونه okhttputils وابستگی okhttp رو حذف کنید
  13. سلام و درود. پست ویرایش شد و سورس هم جهت راحتی کار پیوست شد.
  14. کتابخونه داره درست کار میکنه عزیز چون اون خطا از سرور داره میاد یعنی اینکه ارتباط با سرور برقرار شده.منم دوباره تست کردم و موردی نبود. حالا باید ببینید چرا این پیغام رو میده شاید مقادیر رو دارین اشتباه میفرستین. سورس رو بدون هیچ تغییری رو یه گوشی دیگه هم تست کنید و ایمیل معتبر وارد وارد کنید ببینید چی میشه. در صورت امکان فایل apk رو بزارید که من تست کنم
  15. اگه نیاز بود توضیح میدادیم. تو سورس توکن هست و کار میکنه و سورس رو ران کنید میتونید استفاده کنید. صرفا اگه بخواید با توکن شخصی کار کنید نیازه مراحل بالا رو طی کنید. آموزشهای لازم برای کتابخونه چه متنی و چه تصویری موجوده. شما اگه php داشتین که با کتاخونه های دیگه کار میکرده با این هم کار میکنه. لطفا ادامه سوالات در مورد مشکلات و مسائل مربوط به کتابخونه باشه نه آموزش php یا موارد دیگه. موفق باشید.
  16. چه خطایی میده متن خطا یا اسکرین بزارید
  17. وارد سایت زیر بشید و لاگین کنید. https://gorest.co.in/consumer/login مطابق صفحه زیر توکن رو بگیرید توکن رو طبق شکل زیر جایگزین کنید توی کلاس PrRetrofit و متد retrofit_intercept دقت کنید توکن باید همراه Bearer و یه فاصله باشه دقیقا مطابق سورس. دیگه نباید مشکلی باشه
  18. من فعلا وقت نمیکنم دوست عزیز تا آخر ماه شاید سرم خلوت شه. تو نت سرچ کنید آموزش زیاد هست.
  19. من php کار نکردم دوست عزیز فقط در حد مقدماتی. برای وب سرویس نوشتن پایتون گزینه فوقلاده ای هست و خیلی راحت و سریع میتونید بک اند اپ رو پیاده کنید. اگه خودتون بلد نیستید حتما به یه api نویس و وب کار بدین بنویسه
  20. سلام و درود. api هایی که تو آموزش استفاده شده با پایتون-جنگو نوشته شده که تو پنل قرار گرفت. درمورد اتصال به اینترنت هم تو انجمن تاپیک زیاد هست در موردش جستجو کنید پیدا میکنید
  21. بله دوست عزیز. کرش میکنه. این کلاسها نیاز هست برای کتابخونه
  22. سلام و درود. امیدوارم حالتون خوب باشه از بین چهار کامپوننت اصلی اندروید رسیورها یکی از مهمترینهاش هست. از اونها برای اسال رویداد بین برنامه ها و یا بین خود کامپوننتها استفاده میشه. همینطور برای دریافت اعلانهای سیستمی مثل اس ام اس یا تماس ازشون استفاده میشه. این قابلیت جدیدا به صورت نیتیو به 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 مانا باشید
  23. نسخه جدید اضافه شد و آموزش تصویری به پست اول اضافه شد
  24. عزیز من تست کردم هیچ مشکلی نداره. موارد زیر رو دانلود کنید و کلا یه پوشه sdk جدید بسازید و داخلش بریزید فایها رو.b4a هم نسخه آخر باشه. سورس هم نسخه آخر. نباید مشکلی باشه https://dl.google.com/android/repository/commandlinetools-win-9123335_latest.zip https://www.b4x.com/android/files/resources_11_22.zip
  25. با سلام خدمت عزیزان برنامه نویس پروژه ای که مدت خیلی طولانی هست درگیرش بودیم خدا رو شکر به نتیجه رسید و به نسخه پایدار رسید. بارها مکانیزم پروژه عوض شد تا راحت ترین و ساده ترین تجربه کاربری برای دوستان به وجود بیاد و دیگه درگیر پیچیدگی های جاوا و کدهای پس زمینه نشید. برسیم سراغ کتابخونه Retrofit یک کتابخانه‌ی فوقلاده قوی اندرویدی برای کار با وب سرویس هستش. به خاطر استفاده از annotation و interface خیلی سریع راه اندازی میشه و امکانات خیلی زیادی بهتون میده. خب دیگه چونه بسسه بریم سراغ آموزش. 1: راه اندازی Dim pRetrofit As PersianRetrofit pRetrofit.Initialize("retrofit").baseUrl("http://192.168.129.115:8000/").addConverterFactory _ .addInterceptor.addAuthenticator.build متد addConverterFactory برای تبدیل کلاس جاوا به جیسون هست. به راحتی میتونید کلاس بفرستید به سرور متد addInterceptor برای اینه که بخواین به صورت اتوماتیک به همه ریکوئستها یه کانفیگ رو ست کنید. مثلا میخواین تو همه ریکوئستها هدر Authorization بفرستید. به شکل زیر میشه Private Sub retrofit_intercept(request As Request) request.addHeader("Authorization","Bearer "&accessToken) End Sub متد addAuthenticator برای احراز هویت هست و به طور کلی برای رفرش کردن توکن هست. زمانی که ارور 401 (Unauthorized) متد زیر اجرا میشه و شما باید توکن جدید بگیرید و به ریکوئست پاس بدید Private Sub retrofit_authenticate As Map Dim token As String= getAccessToken(uc.RefreshToken) Dim map As Map map.Initialize map.Put("Authorization","Bearer "&token) Return map End Sub 2: استفاده از متدها به طور کلی برای ارسال درخواست یک کلاس از نوع RequestBuilder باید ساخته بشه و به شکل زیر راه اندازی بشه GET Dim queries As Map:queries.Initialize queries.Put("key1","value1") Dim requestBuilder As RequestBuilder requestBuilder.setMethod(requestBuilder.GET) _ .setEndpoint("public/v2/users").setQueries(queries) POST Dim user As User user.Initialize user.username=username user.password=password Dim requestBuilder As RequestBuilder requestBuilder.setMethod(requestBuilder.POST).setBody(user).setEndpoint("api/token/") MULTIPART Dim imbl As List imbl.Initialize imbl.Add(MultipartUtils.createPartBody("file","image.png",image)) Dim bm As Map bm.Initialize bm.Put("content",MultipartUtils.creteStringBody("image from persian retrofit")) Dim requestBuilder As RequestBuilder requestBuilder.setMethod(requestBuilder.MULTIPART).setEndpoint("api/upload_image/") _ .setMultipartParts(imbl).setMultipartParams(bm) 3: اجرای درخواست برای ارسال و اجرای درخواست به دوصورت میتونیم عمل کنیم 1: Async (اجرا در نخ جداگانه) pRetrofit.enqueue(requestBuilder,"login") Wait For retrofit_onResponse(response As Response) If response.isSuccessful Then Dim body As String=response.body Dim JSON As JSONParser JSON.Initialize(body) Dim resp As Map= JSON.NextObject Log(resp.Get("access")) Else Log(response.error) End If 2: Sync (اجرا در نخ اصلی یا همون main ) Dim response As Response=pRetrofit.execute(requestBuilder) If response.isSuccessful Then Dim body As String=response.body Dim JSON As JSONParser JSON.Initialize(body) Dim resp As Map= JSON.NextObject Log(resp.Get("access")) Else Log(response.error) End If آموزش تصویری 1:آموزش کتابخانه PersianRetrofit قسمت ۱ (مقدماتی) https://www.youtube.com/watch?v=t7VrsePFSmU -------------------------------------------------------------------------------------------------------- 2:آموزش کتابخانه PersianRetrofit قسمت ۲ (مقدماتی) https://www.youtube.com/watch?v=6_i4myiSM1s -------------------------------------------------------------------------------------------------------- 3:آموزش کتابخانه PersianRetrofit قسمت ۳(احراز هویت خودکار) https://www.youtube.com/watch?v=YxqCFRS0e1o -------------------------------------------------------------------------------------------------------- 4:آموزش کتابخانه PersianRetrofit قسمت ۴(دانلود) https://www.youtube.com/watch?v=gUfPSHSRDO0 -------------------------------------------------------------------------------------------------------- 5:آموزش کتابخانه PersianRetrofit قسمت ۵(آپلود) https://www.youtube.com/watch?v=W5W6WZikDHs تمام Have fun
×
×
  • اضافه کردن...