رفتن به مطلب

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

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

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

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

  • روز های برد

    835

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

  1. با سلام خدمت عزیزان برنامه نویس پروژه ای که مدت خیلی طولانی هست درگیرش بودیم خدا رو شکر به نتیجه رسید و به نسخه پایدار رسید. بارها مکانیزم پروژه عوض شد تا راحت ترین و ساده ترین تجربه کاربری برای دوستان به وجود بیاد و دیگه درگیر پیچیدگی های جاوا و کدهای پس زمینه نشید. برسیم سراغ کتابخونه 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
  2. خطا مربوط به کتابخونه نیست. میگه محصولات اشتراکی قابل مصرف نیستن.
  3. یه متد جداگونه بنویسید واسه مصرف کردن خرید بعد توی onIabPurchaseFinished با دستور calsubdelayed اونو صدا بزنید ببینید اکی میشه یا نه‌ نتیجه رو اعلام کنید لطفا
  4. نسخه قبل مشکل داشت و اینکه روی نسخه ۱.۴ مایکت بود. نسخه فعلی مشکلات رفع شده و به نسخه ۱.۶ که نسخه آخر مایکت هست به روز شده. حتما به نسخه جدید آپدیت کنید
  5. سلام و درود. کتابخانه به روز شد نسخه جدید رو دریافت کنید
  6. سلام و درود. این موارد توی آموزشها هست Dim post As PostRequest post=prfn.BuildPostQuery("url","tag") post.addParametrs("ke1","value1") post.addParametrs("ke2","value2") post.addParametrs("ke3","value3")
  7. نسخه بیسیک رو حتما به روز کنید. همینطور sdk و فایلهای extra رو از سایت مرجع بگیرید و سمپلی که گذاشتم رو تست کنید
  8. سلام. نسخه 3 رو دانلود کنید و همچنین نسخه b4a و sdk هم نسخه آخر باشه فک کنم دیگه نیازی به تغییر sdk نیست
  9. از منوی بالای انجمن قسمت فروشگاه و مدیریت خرید دانلود کنید
  10. این کتابخونه به زودی با کتابخوته retrofit جایگزین میشه که به مراتب قدرتمندتره و امکاناتش بیشتره.
  11. سلام و درود. از wait For استفاده نکنید. متدهای success و error رو به صورت ایونت پیاده کنید. تایم اوت رو هم بالا بزارید یک دیقه معمولا میزارن
  12. به جای کد زیر toast.requestDrawPermission از روش زیر استفاده کنید. اول متد زیر رو به اکتیویتی اضافه کنید #if java import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.provider.Settings; public void requestDrawPermission() { Context context = BA.applicationContext; if (Build.VERSION.SDK_INT > 23 && !Settings.canDrawOverlays(context)) { Intent intent = new Intent( Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName()) ); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } } #end if حالا کتابخونه javaobject رو تیک بزنید و به شکل زیر متد رو صدا بزنید Dim jo As JavaObject jo.InitializeContext.RunMethod("requestDrawPermission",Null)
  13. شما متد Build رو صدا نزدین. قبل از نمایش باید این متد رو صدا بزنید که ویوها ساخته بشه. کدتون به شکل زیر باید باشه toast.Initialize("toast").Title("test").Icon(LoadBitmap(File.DirAssets,"caution1.png")).Build.Show قبل از همه چیز هم باید متد زیر رو صدا بزنید و دسترسی ترسیم رو بگیرید toast.requestDrawPermission
  14. سلام. چه خطایی دریافت میکنید؟
  15. آخرین نسخه موجود 5.11 هست از پنل دانلود و جایگزین کنید
  16. سلام و درود. از اونجایی که DsTabLayout از نسخه ساپورت استفاده میکنه و کتابخونه قدیمی و منسوخ شده هست و ریسایکلر ویو نسخه androidX هست احتمال اینکه تداخل داشته باشن خیلی زیاده. من که اصلا نتونستم از DsTabLayout استفاده کنم چون خطا میده و کامپایل نمیشه. اما اگه تداخل نداشته باشن به نظرم میتونید با هم استفاده کنید. به دوتا متد زیر توجه کنید Private Sub prrecycler_onScrollStateChanged(newState As Int) If newState==prRecycler.SCROLL_STATE_IDLE Then If prRecycler.AdapterPosition<>-1 Then dsTabLayout.SelectTab(prRecycler.AdapterPosition) End If End If End Sub Private Sub dstab_TabSelected(Index As Int, SelectedTab As String, Tag As Object) prRecycler.scrollToPosition(Index) End Sub درمورد سوال دوم هم که عرض شد. متد رو باید مستقیم از خود ریسایکلر صدا بزنید prRecycler.disableItemChangeAnimation
  17. سلام ودرود. از منوی بالای انجمن قسمت فروشگاه مدیریت خرید رو انتخاب کنید
  18. سلام به همه برنامه نویسای عزیز. بعد مدتها یه آموزش بزاریم کیف کنیم همونطور که مطلع هستید بازار خیلی وقته درون پرداخت رو با پولکی انجام میده و این کتابخونه مخصوص کاتلین هست و به راحتی نمیتونید اونو مستقیم توی جاوا استفاده کنید. برا همین یه کلاس واسط که به اصطلاح از دیزاین پترن پ * ر * و * ک *س * ی استفاده شده برای دوستان آماده کردیم که راحت بتونن اونو توی جاوا استفاده کنن. دقت کنید که حتما باید کاتلین توی پروژه ست شده باشه. کلاس کاتلین زیر رو به پروژه اضافه کنید و اسمشو PoolakeyWrapper بزارید. package com.example.myapplication import android.content.Context import androidx.activity.result.ActivityResultRegistry import ir.cafebazaar.poolakey.Connection import ir.cafebazaar.poolakey.Payment import ir.cafebazaar.poolakey.config.PaymentConfiguration import ir.cafebazaar.poolakey.config.SecurityCheck import ir.cafebazaar.poolakey.entity.PurchaseInfo import ir.cafebazaar.poolakey.request.PurchaseRequest /** * Created by Mohamadreza Shahpiri on 6/18/2023. * Answercenter.ir *************************************************** */ class PoolakeyWrapper( publicKey: String, context: Context, ) { private val securityCheck = SecurityCheck.Enable(rsaPublicKey = publicKey) private val paymentConfig = PaymentConfiguration(localSecurityCheck = securityCheck) private val payment = Payment(context = context.applicationContext, config = paymentConfig) private var connection:Connection?=null fun connect(connectionCallback: ConnectionCallback){ connection=payment.connect { connectionSucceed{ connectionCallback.connectionSucceed() } connectionFailed { connectionCallback.connectionFailed(it) } disconnected { connectionCallback.disconnected() } } } fun purchaseProduct(registry: ActivityResultRegistry,request: PurchaseRequest,purchaseCallback: PurchaseCallback){ payment.purchaseProduct(registry,request){ purchaseFlowBegan { purchaseCallback.purchaseFlowBegan() } failedToBeginFlow { purchaseCallback.failedToBeginFlow(it) } purchaseSucceed { purchaseCallback.purchaseSucceed(it) } purchaseCanceled { purchaseCallback.purchaseCanceled() } purchaseFailed { purchaseCallback.purchaseFailed(it) } } } fun subscribeProduct(registry: ActivityResultRegistry,request: PurchaseRequest,purchaseCallback: PurchaseCallback){ payment.subscribeProduct(registry,request){ purchaseFlowBegan { purchaseCallback.purchaseFlowBegan() } failedToBeginFlow { purchaseCallback.failedToBeginFlow(it) } purchaseSucceed { purchaseCallback.purchaseSucceed(it) } purchaseCanceled { purchaseCallback.purchaseCanceled() } purchaseFailed { purchaseCallback.purchaseFailed(it) } } } fun consumeProduct(purchaseToken: String,consumeCallback: ConsumeCallback){ payment.consumeProduct(purchaseToken){ consumeSucceed { consumeCallback.consumeSucceed() } consumeFailed { consumeCallback.consumeFailed(it) } } } fun getPurchasedProducts(queryCallback: QueryCallback){ payment.getPurchasedProducts { querySucceed { queryCallback.querySucceed(it) } queryFailed { queryCallback.queryFailed(it) } } } fun getSubscribedProducts(queryCallback: QueryCallback){ payment.getSubscribedProducts { querySucceed { queryCallback.querySucceed(it) } queryFailed { queryCallback.queryFailed(it) } } } fun disconnect(){ connection?.disconnect() } interface ConnectionCallback{ fun connectionSucceed() fun connectionFailed(throwable:Throwable) fun disconnected() } interface PurchaseCallback{ fun purchaseFlowBegan() fun failedToBeginFlow(throwable:Throwable) fun purchaseSucceed(info: PurchaseInfo) fun purchaseCanceled() fun purchaseFailed(throwable:Throwable) } interface ConsumeCallback{ fun consumeSucceed() fun consumeFailed(throwable:Throwable) } interface QueryCallback{ fun querySucceed(items:List<PurchaseInfo>) fun queryFailed(throwable:Throwable) } } حالا توی جاوا به شکل زیر ازش استفاده کنید. مثلا برای اینشیالایز. PoolakeyWrapper poolakeyWrapper=new PoolakeyWrapper("publicKey",this); poolakeyWrapper.connect(new PoolakeyWrapper.ConnectionCallback() { @Override public void connectionSucceed() { } @Override public void connectionFailed(@NonNull Throwable throwable) { } @Override public void disconnected() { } }); و برای خرید PurchaseRequest purchaseRequest=new PurchaseRequest( "productId","payload","dynamicPriceToken" ); poolakeyWrapper.purchaseProduct(getActivityResultRegistry(), purchaseRequest, new PoolakeyWrapper.PurchaseCallback() { @Override public void purchaseFlowBegan() { } @Override public void failedToBeginFlow(@NonNull Throwable throwable) { } @Override public void purchaseSucceed(@NonNull PurchaseInfo info) { } @Override public void purchaseCanceled() { } @Override public void purchaseFailed(@NonNull Throwable throwable) { } }); بقیه متدها رو هم به راحتی میتونید استفاده کنید. مانا باشید
  19. سلام ودرود. درمورد مشکل اول دستور disableItemChangeAnimation رو تست کنید و در مورد مسأله دوم دستور AdapterPosition
  20. سلام و درود. از قسمت مدیریت خرید میتونید دانلود کنید.
  21. سلام و درود. لینک درسته عزیز. پارس پسک پک به حجم فایل گیر میده که باید پلن پولی برای cdn فعال بشه. احتمالا cdn رو ببریم روی کلودفلر یا فایلهای دانلودی رو جابه جا کنیم
  22. سلام و درود. از منوی فروشگاه مدیریت خرید دانلود کنید.
  23. سلام و درود. آخرین نسخه بیسیک و sdk رو از سایت مرجع بگیرید و پروژه رو ران کنید
  24. سلام و درود. کتابخونه بروزرسانی شد. نسخه 2.1. از فلگ FLAG_IMMUTABLE باید استفاده کنید
  25. سلام و درود. از خطا مشخصه که کتابخونه ChromCustomTabs داره از پکیجهای قدیمی support استفاده میکنه. باید نسخه به روز کتابخونه رو بگیرید یا اینکه jetifireکنید
×
×
  • اضافه کردن...