اذهب إلى المحتوى

Flutter Dev

الأعضاء
  • المساهمات

    787
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    2

أجوبة بواسطة Flutter Dev

  1. @عبدالرشيد احمد

    السلام عليكم ورحمة الله وبركاته

    هلا بيك ي غالي

    اعذرني اول شي على تاخر ردي كنت شغال ب كود صفحة مختلفة السموحه منك

    جاري تجريب الكود ورح اوافيك ب النتيجة باذن الله بعد دقائق 

    @عبدالرشيد احمد

    هلا بيك عزيزي

    قمت بتطبيق الكود المرفق منك اخوي

    اول من اعمل طلب لرمز يصير كراش ل تطبيق وهذا نتيجة Logcat

    java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.tasks.Task com.google.firebase.auth.FirebaseAuth.signInWithCredential(com.google.firebase.auth.AuthCredential)' on a null object reference
            at com.example.myapplication.MainActivitytt.signInWithCredential(MainActivitytt.java:101)
            at com.example.myapplication.MainActivitytt.access$300(MainActivitytt.java:26)
            at com.example.myapplication.MainActivitytt$2.onVerificationCompleted(MainActivitytt.java:90)
            at com.google.firebase.auth.api.internal.zzer.zza(Unknown Source)
            at com.google.firebase.auth.api.internal.zzeu.run(Unknown Source)
            at android.os.Handler.handleCallback(Handler.java:751)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6682)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

    مع العلم ان  الرقم يصل او رمز التفعيل استقبله ولكن الكراش موجود

  2. السلام عليكم ورحمة الله وبركاته 

    تحيه طيبه للجميع 

    لدي استفسار انا عامل SharedPreferences لحفظ البيانات من edittext  لما اخرج من الاكتفتي او انتقل اكتفتي ثاني لا يتم حذف البيانات الكود شغال ميه ميه المشكلة فقط الكود حاليا يعمل لدى edittext1 مثلا ولكن  انا لدي اكثر من حقل edittext3 ,edittext1,edittext1

     

     final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
            editText.setText(pref.getString(LAST_TEXT, ""));
            editText1.setText(pref.getString(LAST_TEXT2, ""));
            editText2.setText(pref.getString(LAST_TEXT3, ""));
            editText3.setText(pref.getString(LAST_TEXT4, ""));
            editText4.setText(pref.getString(LAST_TEXT5, ""));
            editText5.setText(pref.getString(LAST_TEXT6, ""));
       
            editText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                    pref.edit().putString(LAST_TEXT, s.toString()).commit();
                    pref.edit().putString(LAST_TEXT2, s.toString()).commit();
                    pref.edit().putString(LAST_TEXT3, s.toString()).commit();
                    pref.edit().putString(LAST_TEXT4, s.toString()).commit();
                    pref.edit().putString(LAST_TEXT5, s.toString()).commit();
                    pref.edit().putString(LAST_TEXT6, s.toString()).commit();
                    pref.edit().putString(LAST_TEXT7, s.toString()).commit();
                
    
                }
    
    
    
            });

     

     لو عملته بشكل التالي رح يعمل في اول حقل فقط 

    كيف ممكن اضيف جميع الحقول ؟ اكثر طريقة مختصره ممكن للكود لو تكرمتو الي معه فكره احتاج

  3. بتاريخ منذ ساعة مضت قال محمد ربيع زليول:

    يمكنك ان تطلب من المستخدم في أول دخول له إختيار بلده، أو يمكنك على ما أعتقد إستخدام بعض الدوال في أندرويد لإعطائك دولة المستخدم، مثلًا هته الدالة ستعطيك كود دولة إنطلاقًا من اللغة المستخدمة في الهاتف:

    
     String locale = context.getResources().getConfiguration().locale.getCountry(); 

    يمكنك أيضًا إستخدام الكود التالي للحصول على 3 أرقام للبلد:

    
     String locale = context.getResources().getConfiguration().locale.getDisplayCountry();

    يعتمد هذا الحل على إعدادات هاتف المستخدم، يمكنك إستخدمه أو إستخدام location المستخدم مثلًا، ومن الجيد أن توفر إمكانية تعديل البلد من خلال التطبيق.

    كل الشكر لك عزيزي 

    ربي يعطيك الف عافيه 

  4. بتاريخ 3 دقائق مضت قال عبدالرشيد احمد:

    السلام عليكم ورحمه الله وبركاته،

    إستعملت هاذا من قبل https://www.ramnode.com عندهم خدمات cloud vps رخيص جدا.

    وعليكم السلام ورحمة الله وبركاته

    هلا بيك اخوي

    شاكر لك عزيزي افادتك

    ربي يعطيك العافيه

  5. بتاريخ 45 دقائق مضت قال محمد ربيع زليول:

    هناك العديد من الطرق بالطبع.

    هناك من يربط المتاجر بالدول: فمثلاً عند تسجيل متجر جديد يحدد المتجر الدول التي يتواجد بها، وبهذا وبعد أن يقوم المستخدم بإختيار دولته، يقوم الموقع بعرض المتاجر الموجودة بتلك الدولة التي اختارها المستخدم، أو بالأحرى يقوم الموقع بعرض السلع المتواجدة بمتاجر تلك الدولة.

    وهناك من يقوم بعرض السلع الأكثر زيارةً أو الأكثر شراءًا من طرف المستخدمين في تلك الدولة التي اختارها المستخدم.

    يمكنك عمل هذا عن طريق إضافة خانة عند تسجيل متجر جديد أو عند التعديل على معلومات المتجر تطلب من المتجر إدخال الدولة أو الدول التي يتواجد بها، وبعد ذلك عند دخول مستخدم ما وإختار دولته، قم بتسجيل الدولة ضمن معلومات المستخدم، وإن لم يكن المستخدم مسجلًا لدخوله يمكنك تسجيل الدولة في التطبيق، وبعد ذلك عندما تقوم بإرسال طلب لجانب الخادم ليأتي بالمواضيع، ارسل رقم أو إسم الدولة، وقم بالبحث عن المواضيع التي تتواجد بمتاجر تلك الدولة.

    نفترض لدي متاجر ولكن المتاجر عامة بمعنى لا استطيع تحديدها ولكن استطيع تحديد السلع المنشوره حسب الفكره التي قمت بشرحها انت

     

    في جدول السلع خانه باسم country of item مثلا ولما يدخل المستخدم لتطبيق لزم يختار هو من اي بلد وعلى اختياره رح يعرض له التطبيق السلع الي تم تخزينها مسبقا في دولته

     

    استطيع القيام بهذا الفكره باستخدم  Shared Preferences اذا المستخدم عمل تسجيل عضويه من خلال صفحة التسجيل رح احفظ بيانات الدوله وكلما فتح ب حسابه رح استخدم  Shared Preferences لجلب الدوله وعرض المواضيع او السلع

     

    واذا لم يعمل عضويه افترض ان الفكره ايضا ممكنه من خلال  Shared Preferences

     

     

    ولكن بنسبه ل عرض صفحة اختيار الدول او صفحه مخصصه للمستخدم في اول دخول له لتطبيق كيف يمكن عمل ذلك؟

  6. السلام عليكم ورحمة الله وبركاته

    لدي استفسار لو تكرمتو..

    لقد سبق وشاهدت في بعض التطبيقات مثل OLX والسوق المفتوح تقريبا يتم سوال المستخدم في بداية دخوله لتطبيق في اول مره عن بلده ثم يتم عرض المواضيع إعتماداً على الموقع الذي اختاره مع امكانية عرض الجميع طبعا

     

    كيف يتم عمل ذلك؟كيف ممكن نعمله؟

    ياليت اذا احد معه فكره عن الموضوع يساعدنا

  7. بتاريخ 48 دقائق مضت قال عبدالرشيد احمد:

    نعم، بعد إدخال رقم ألهاتف،  إذا رسل رمز روح لإشاشة التحقيق أو إذا تم التحقيق من قبل تخطى شاشة التحقيق.

    حدقق كودك وأشوف لك حل إلا بكرة أو بعدها إنشاء الله.

    طيب عزيزي

    كل الشكر لك وربي يجزيك الف عافيه

  8. بتاريخ 15 دقائق مضت قال محمد ربيع زليول:

    على العموم يمكنك إستخدام بعض مميزات firebase مع قواعد بيانات mysql، كما يمكنك الإشتغال ب firebase وحده، بحيث أن firebase يوفر ميزة قواعد البيانات real time.

    نعم، يمكن إستخدام قواعد بيانات firebase في حالتك، عليك فهم الطريقة التي تعمل بها هذه القواعدة والطريقة التي يمكنك عن طريقها القيام بكل عملية من العمليات في جزء الخادم، فالإشتغال ب firebase مختلف عن الإشتغال عن طريق PHP وMySQL في جزء الخادم.

    لم يسبق لي العمل مع فايربيس ولكني حسب ما فهمت لا يمكنني تحميل قواعد mysql وملفات php التي لدي الان وجاهزه ل مشروعي ولا يمكنني تغير مشروعي كامل الان

    بمعنى اخر انا مجبور على عدم استخدمها لدى مشروعي الان

     

    هذا ما فهمته من شرحك عزيزي

     

    كل الشكر لك ي غالي

  9. بتاريخ 11 دقائق مضت قال محمد ربيع زليول:

    هناك العديد من مواقع الإستضافات، وتختلف الأسعار وخدمة العملاء والعروض المقدمة من موقع لأخر.

    تحتوي القائمة التالية على أفضل الإستضافات على مستوى العالم:

    تعتبر Bluehost الخدمة الأفضل لهذه السنة، كما تعتبر خدمة Hostinger الخدمة الأرخص، ولموقع SiteGround أفضل خدمة عملاء حسب تصنيف بعض المواقع.

    ستجد في هذا الرابط، مقارنة لمواقع الإستضافة، المقارنة بعدة معايير يمكنها أن تساعدك في إختيار الأفضل.

    شخصيًا جربت كل من Bluehost و GoDaddy، وبالنسبة لي كانت Bluehost هي الأفضل.

    كما أنه سبق لي تجربة 000webhost مرة واحدة، لكني لم أحب الإشتغال بها، أعتقد أن المشكلة كانت من cpanel لم أكن متعودًا عليه.

    طيب عزيزي كيف بخصوص قواعد firebase

    وهل ممكن اختيار قواعد firebase في حالتي الان؟

     

    واذا ممكن ما رايكم بها؟

  10. بتاريخ 9 دقائق مضت قال عبدالرشيد احمد:

    مش متاكد إذا كان النضام من عندهم للتوفير sms ولاكن يوفر.

    نعم أذا تقوم بالتجارب فقط، عادي! ولاكن للمستخدم الحقيقي أذا تعرض لاهاذا السيناريو, إذا خرج وحاول أن يدخل مرة أخرى، عشان لا ينتصر لساعات ولا يستطيع أن يدخل البرنامج تعامل مع هاذا السيناريو. 

    طيب السلام عليكم ورحمه الله وبركاته

    هل فيه حل ممكن نعمله طيب يحل هذا المشكله؟

  11. بتاريخ 3 دقائق مضت قال عبدالرشيد احمد:

    طيب شفت المشكلة، إذا تم إستخدام الرمز وتم التحقيق مع تجربتي لم يرسل رمز جديد أيضاً وهاذا عشان لا داعي، هاذا الطريق توفر sms و جميل. 

    عندنا ثلاثة سيناريوهات هنا: 

    ١. onCodeSent هنا إذا تم إرسال رمز روح لإشاشة التحقيق مع intent

    ٢. onVerificationCompleted هنا إذا تم التحقيق من قبل و خرج المستخدم ب singout ولم يمر مدة كثيرة والبرنامج في نفس الهاتف، لا داعي لإرسال رمز جديد. هنا firebase تتعامل مع هاذا وعليك أن تعمل signin with credentials فقت ثم intent الذي تريد بعده

    ٣.onVerificationFailed هنا تعامل بالمشاكل بطريقتك الخاصة.

     

    رابط للمعلومات https://firebase.google.com/docs/auth/android/phone-auth

    اذن كل المشكلة هيا ان نظام firebase يعمل كذا من اجل توفير sms او الباقه ..

    لا باس اهم نقطة الرمز يصل ويتكرار وصوله في حالة المستخدم لم يعمل تاكيد على الرمز لقد تركت الامر بهذا الطريقة لا باس بذلك

     

    كل الشكر لك ي غالي على الافاده وتوضيح ربي يعطيك الف عافيه

  12. السلام عليكم ورحمة الله وبركاته

    حبيت استفسر عن استضافه قد تمت تجربتها من قبلكم وكانت ممتازه

    من ناحية الاسعار والدعم الفني؟  

    عربيه او اجنبيه وما هيا؟ 

    كذلك ما رايكم ب استضافة

    https://ae.000webhost.com/

    لقد رايت الكثير من المبرمجين في شروحات الاندرويد يستخدمونها

     

    مع العلم اني ارغب برفع قواعد بيانات من نوع mysql وملفات php الخاصه بتطبيقي اندرويد

    وهل ممكن اختيار قواعد firebase في حالتي الان؟

    واذا ممكن ما رايكم بها؟

     

  13. بتاريخ 49 دقائق مضت قال عبدالرشيد احمد:

    السلام عليكم ورحمه الله وبركاته، 

    حبيبي هل مشكلتك عندما يجيك الرمز وإستخدمته، ثم خرجت من البرنامج وحاولت أن تدخل مرة أخرى لم يصلك رمز جديد؟

    هلا بيك عزيزي

    نعم وانا احاول برمجة المشروع كنت اجرب وواجهتني هذا المشكله بضبط مثل ما ذكرت انت

     

    اما لو وصلني الرمز ولم استخدمه لا توجد اي مشكله بامكاني ان اطلب الرمز اكثر من 4 مرات خلف بعض بدون اي مشاكل 

     

    هيا تحدث فقط في حالة استخدامي لرمز لا استطيع بعدها طلب رمز جديد 

  14. يبدو ان الامر يحصل فقط في حالة ان المستخدم قد تحقق من رمز OTP لقد قمت بتجربة التاليه

    قمت بطلب OTP ولكن لم اعمل تحقق وقد تم ارساله لي وقمت بنفس الخطوه مره ثانيه وثالثه والامر ناجح اذن المشكلة فقط لو المستخدم عمل تحقق فلن يستطيع طلبه من جديد قبل اعادة التشغيل

    على هذا النحو لا بأس بالامر شكرا لك عزيزي كثير يمشي الحال في الوقت الحالي لا مشكلة

    • أعجبني 1
  15. هلا بيك عزيزي اعتذر ادري تعبتك معي كثير السموحه

    نفس المشكله مثل ما قمنا بعمل الكود في اول مره لا يتم استقبل الرمز للمره الثانية حتى انني قمت بتجربة رقم هاتف مختلف والمشكله نفسها مستمره 

  16. بتاريخ 9 دقائق مضت قال Mohamd Imran:

    اعتذر قم بإضافة متغير من نوع String بإسم mText وأعد إرجاع المتغير mToken إلى اوبجيك PhoneAuthProvider.ForceResendingToken

    وقم بإسناد editText.getText().toString() إليه ثم  إستخدمه في الميثود في ال onClicklistener الخاص بال edittext  

    
    mText = editText.getText().toString();
    
    resendVerificationCode(mText,mToken);

     

    اذا انا فاهم عدل بيكون شكل الكود كالتالي كامل:

    public class VerifyPhoneActivity extends AppCompatActivity {
        private static final String TAG = "VerifyPhoneActivity";
    
        private PhoneAuthProvider.ForceResendingToken mResendToken;
        private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
    
        private String verificationId;
        private FirebaseAuth mAuth;
        private ProgressBar progressBar;
        private EditText editText;
        private String mToken;
       String mText;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_verify_phone);
    
            mAuth = FirebaseAuth.getInstance();
    
            progressBar = findViewById(R.id.progressbar);
            editText = findViewById(R.id.editTextCode);
            findViewById(R.id.tt).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  //  mAuth.getInstance().signOut();
                    resendVerificationCode(mText,mToken);
                 //   resendVerificationCode(editText.getText().toString(),mToken);
                }
            });
    
            String phonenumber = getIntent().getStringExtra("phonenumber");
            sendVerificationCode(phonenumber);
    
            findViewById(R.id.buttonSignIn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mText = editText.getText().toString();
                    String code = editText.getText().toString().trim();
    
                    if (code.isEmpty() || code.length() < 6) {
    
                        editText.setError("Enter code...");
                        editText.requestFocus();
                        return;
                    }
                    verifyCode(code);
                }
            });
    
        }
    
        private void verifyCode(String code) {
            PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
            signInWithCredential(credential);
        }
    
        private void signInWithCredential(PhoneAuthCredential credential) {
            mAuth.signInWithCredential(credential)
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
    
                                Intent intent = new Intent(VerifyPhoneActivity.this, ProfileActivitytt.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
                                startActivity(intent);
    
                            } else {
                                Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                            }
                        }
                    });
        }
    
        private void sendVerificationCode(String number) {
            progressBar.setVisibility(View.VISIBLE);
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    number,
                    10,
                    TimeUnit.SECONDS,
                    this,
                    mCallBack
            );
    
        }
    
        private PhoneAuthProvider.OnVerificationStateChangedCallbacks
                mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
    /*
            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                verificationId = s;
            }
    
     */
            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken ) {
                super.onCodeSent(s, forceResendingToken);
                verificationId = s;
               // mToken = forceResendingToken;
                mText = editText.getText().toString().trim();
            }
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                String code = phoneAuthCredential.getSmsCode();
                if (code != null) {
                    editText.setText(code);
                    verifyCode(code);
                }
            }
    
            @Override
            public void onVerificationFailed(FirebaseException e) {
    
              Toast.makeText(VerifyPhoneActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        };
    
        private void resendVerificationCode(String phoneNumber,
                                            PhoneAuthProvider.ForceResendingToken token) {
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    phoneNumber,
                    10,
                    TimeUnit.SECONDS,
                    this,
                    mCallBack,
                    token);
        }
    
    
    }

     

     

    problem3.thumb.png.885fa8244919ef3c5a2b1f9f011faadd.png

    • أعجبني 1
  17. بتاريخ 3 دقائق مضت قال Mohamd Imran:

    هنا قم بتعديل المتغير إلى نوع String

    
    private String mToken;

    وإستدل TaskExecutors.MAIN_THREAD بthis  الميثود التالية 

    
     private void sendVerificationCode(String number) {
            progressBar.setVisibility(View.VISIBLE);
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    number,
                    10,
                    TimeUnit.SECONDS,
                    this,
                    mCallBack
            );
    
        }

    وبالنسبة  للخطأ هذا 

    فهو ببساطة لأنه يحتاج إلى تسجل الدخول أولاً قبل الحصول على التوكن ,لذلك يجب أن تقوم بإستخدام تسجيل الدخول مع جوجل ثم الحصول على المستخدم وإستخدامه في الميثود signInWithCredential تفضل متوفر هنا الكود الرسمي من جوجل لهذه العملية هنا ,بعد تطبيق ذلك المفترض أن يعمل بدون مشاكل وبالنسبة لإعادة تشغيل الجهاز فهو لأن الجلسة تنتهي عند إغلاق التطبيق لكن بعد تطبيق المذكور ستحل المشكلة إن شاء الله  

    قمت بتعديل التالي:

    private String mToken;

    فظهرت لدي المشكله التاليه :

    problem1.thumb.png.df4be0332db2343bd8b58a211aced28c.png

    'resendVerificationCode(java.lang.String, com.google.firebase.auth.PhoneAuthProvider.ForceResendingToken)' in 'com.example.myapplication.VerifyPhoneActivity' cannot be applied to '(java.lang.String, java.lang.String)'

    problem2.thumb.png.10d4fc39a72d6881d20ca55199b799c3.png

    Incompatible types. Found: 'com.google.firebase.auth.PhoneAuthProvider.ForceResendingToken', required: 'java.lang.String'

     

     

     

    • أعجبني 1
  18. بتاريخ 16 دقائق مضت قال Mohamd Imran:

    صحيح 

    يوجد لديك خطأ هنا عدل الميثود 

    
     @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                verificationId = s;
            }

    قم بعمل متغير بإسم mToken وعدل الميثود إلى 

    
     @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                verificationId = s;
    			mToken = forceResendingToken;
            }

    ثم نقوم بإستخدام الميثود التالية لإجبار إعادة إرسال الرمز مرة أخرى 

    
    private void resendVerificationCode(String phoneNumber,
                                        PhoneAuthProvider.ForceResendingToken token) {
        PhoneAuthProvider.getInstance().verifyPhoneNumber(
                phoneNumber,        
                60,                 
                TimeUnit.SECONDS,  
                this,               
                mCallback,         
                token);             
    }

    ثم قم بعمل زر مثلا ,وإستدعي الميثود عند ضغط الزر لإجبار إعادة إرسال الرمز نستعديها هكذا مع تمرير الرقم ومتغير mToken إليها 

    
    resendVerificationCode(phonenumber,mToken);

     

     

     

     

     

    هلا بيك عزيزي @Mohamd Imran

    قمت بعمل الكود كامل مع تعديلك كالتالي :

    public class VerifyPhoneActivity extends AppCompatActivity {
        private static final String TAG = "VerifyPhoneActivity";
    
        private PhoneAuthProvider.ForceResendingToken mResendToken;
        private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
    
        private String verificationId;
        private FirebaseAuth mAuth;
        private ProgressBar progressBar;
        private EditText editText;
        private PhoneAuthProvider.ForceResendingToken mToken;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_verify_phone);
    
            mAuth = FirebaseAuth.getInstance();
    
            progressBar = findViewById(R.id.progressbar);
            editText = findViewById(R.id.editTextCode);
            findViewById(R.id.tt).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  //  mAuth.getInstance().signOut();
                    resendVerificationCode(editText.getText().toString(),mToken);
                }
            });
    
            String phonenumber = getIntent().getStringExtra("phonenumber");
            sendVerificationCode(phonenumber);
    
            findViewById(R.id.buttonSignIn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    String code = editText.getText().toString().trim();
    
                    if (code.isEmpty() || code.length() < 6) {
    
                        editText.setError("Enter code...");
                        editText.requestFocus();
                        return;
                    }
                    verifyCode(code);
                }
            });
    
        }
    
        private void verifyCode(String code) {
            PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
            signInWithCredential(credential);
        }
    
        private void signInWithCredential(PhoneAuthCredential credential) {
            mAuth.signInWithCredential(credential)
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
    
                                Intent intent = new Intent(VerifyPhoneActivity.this, ProfileActivitytt.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
                                startActivity(intent);
    
                            } else {
                                Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                            }
                        }
                    });
        }
    
        private void sendVerificationCode(String number) {
            progressBar.setVisibility(View.VISIBLE);
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    number,
                    10,
                    TimeUnit.SECONDS,
                    TaskExecutors.MAIN_THREAD,
                    mCallBack
            );
    
        }
    
        private PhoneAuthProvider.OnVerificationStateChangedCallbacks
                mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
    /*
            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                verificationId = s;
            }
    
     */
            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                verificationId = s;
                mToken = forceResendingToken;
            }
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                String code = phoneAuthCredential.getSmsCode();
                if (code != null) {
                    editText.setText(code);
                    verifyCode(code);
                }
            }
    
            @Override
            public void onVerificationFailed(FirebaseException e) {
          
              Toast.makeText(VerifyPhoneActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        };
    
        private void resendVerificationCode(String phoneNumber,
                                            PhoneAuthProvider.ForceResendingToken token) {
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    phoneNumber,
                    10,
                    TimeUnit.SECONDS,
                    this,
                    mCallBack,
                    token);
        }
    
    
    }

     

    ولكن المشكلة لا تزال مستمره في حالة المرة الاولى للمستخدم يستطيع استقبل الكود ولكن لو عمل للمره الثانية لا يستطيع ذلك لا يستقبل الكود الا اذا قمت باعادة تشغيل هاتفي 

    مع العلم انني حتى من جدول المستخدمون قمت بحذفه ولكن لم تحل المشكلة 

    ايضا كود اعادة ارسال الرمز الان بعد الضغط عليه يعود بي الى صفحة تسجيل الرقم مع تفاصيلي التي ادخلتها سابقا مثل الدوله + رقم الهاتف ولما اعمل ارسل الرمز ايضا لا يتم الارسال.

     

    لا اعلم ما هيا العلاقه بين اعادة تشغيل الهاتف واستقبل الرمز بهذا الطريقة

     

     

    ارفقت ملف المشروع كامل ليكون اوضح

    MyApplication3.rar

    • أعجبني 1
  19. بتاريخ 1 دقيقة مضت قال Mohamd Imran:

    مرحباً أخي @مروان مروان3

    هذه ليست مشكلة في إرسال الكود لكن ما يحدث هو إذا قرأت الdocs الخاص بالخدمة يوضحون بأن الميثود verifyPhoneNumber إذا قمت بإستعادئها عدة مرات مثلا عند إستجعائها من الميثود onStart أو أي ميثود تعمل عند بدء تشغيل التطبيق فإن الميثود verifyPhoneNumber لن ترسل رسالة تأكيد إلا بعد إنتهاء مهلة الطلب  ومهلة الطلب أنت محددها 60 وهذا كثير لذلك جرب تغييرها إلى ١٠ هنا 

    
    private void sendVerificationCode(String number) {
            progressBar.setVisibility(View.VISIBLE);
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    number,
                    10,
                    TimeUnit.SECONDS,
                    TaskExecutors.MAIN_THREAD,
                    mCallBack
            );
    
        }

     

    هلا بيك عزيزي

    60 ثانية او انا غلطان ؟

    لني قمت بالانتظار لكثر من 4 ساعات تقريبا والمشكلة مستمره فقط حينما اعيد تشغيل الجهاز استطيع استقبل الرمز لمرة واحده ولو حاولت من جديد لن ياتي حتى اعيد التشغيل مره اخره هذا ما وجدته بعد التجربه

    • أعجبني 1
  20. السلام عليكم ورحمة الله وبركاته

    استخدم خاصية OTP من firebase لتحقق من ارقام المشتركين في تطبيقي وقد واجهتني مشكلة في حالة المستخدم تاخر فس ادخال رمز OTP قمت باضافة زر للقيام باعادة ارسال الرمز للمستخدم ولكن لم اعلم كيف يمكنني كتابة كود الاستعاده

    انا استخدم هذا الكود الان كامل

     

    public class VerifyPhoneActivity extends AppCompatActivity {
    
    
        private String verificationId;
        private FirebaseAuth mAuth;
        private ProgressBar progressBar;
        private EditText editText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_verify_phone);
    
            mAuth = FirebaseAuth.getInstance();
    
            progressBar = findViewById(R.id.progressbar);
            editText = findViewById(R.id.editTextCode);
            findViewById(R.id.tt).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
    //=======here I want add it==============///////////
    
                }
            });
    
            String phonenumber = getIntent().getStringExtra("phonenumber");
            sendVerificationCode(phonenumber);
    
            findViewById(R.id.buttonSignIn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    String code = editText.getText().toString().trim();
    
                    if (code.isEmpty() || code.length() < 6) {
    
                        editText.setError("Enter code...");
                        editText.requestFocus();
                        return;
                    }
                    verifyCode(code);
                }
            });
    
        }
    
        private void verifyCode(String code) {
            PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
            signInWithCredential(credential);
        }
    
        private void signInWithCredential(PhoneAuthCredential credential) {
            mAuth.signInWithCredential(credential)
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
    
                                Intent intent = new Intent(VerifyPhoneActivity.this, ProfileActivitytt.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
                                startActivity(intent);
    
                            } else {
                                Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                            }
                        }
                    });
        }
    
        private void sendVerificationCode(String number) {
            progressBar.setVisibility(View.VISIBLE);
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    number,
                    20,
                    TimeUnit.SECONDS,
                    TaskExecutors.MAIN_THREAD,
                    mCallBack
            );
    
        }
    
        private PhoneAuthProvider.OnVerificationStateChangedCallbacks
                mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
    
            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                verificationId = s;
            }
    
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                String code = phoneAuthCredential.getSmsCode();
                if (code != null) {
                    editText.setText(code);
                    verifyCode(code);
                }
            }
    
            @Override
            public void onVerificationFailed(FirebaseException e) {
                Toast.makeText(VerifyPhoneActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        };
    
    
    }
    

     

    • أعجبني 1
  21. لقد وجدت حل للمشكله ولكن هذا حل مواقت لا يمكن تطبيقه لدى المستخدمون فقط لدي انا 

    في حالة قمت باعادة تشغيل الهاتف استطيع استقبل رمز التحقق من جديد 

    كيف يمكنني حل هذا المشكله بدون الحاجه الى اعادة تشغيل للهاتف؟ من غير المنطقي ان اطلب من المستخدم اعادة تشغيل هاتفه في كل عملية تحقق غير نجاحه

     

  22. السلام عليكم ورحمة الله وبركاته 

    اسعد الله اوقاتكم جميعا يا رب

    لدي استفسار لو تكرمتو 

    قمت بتجربة خدمة فايربيس لتحقق من رقم الهاتف . في بداية تفعيلي للخدمه كان كل شي ولكن مع التجارب وطلب الرمز لكذا مره حدث  انقطاع في استقبل الرمز لم اعد قادر على استقبل رمز التحقق

    طبعا قلت ممكن يحتاج وقت وتوقفت اكثر من 5 ساعات ولكن بعد التجربة لا تزال المشكلة مستمرة.

    وقد شاهدت ايضا بانني لو قمت باضافة رقم هاتفي في نظام هواتف الاختبار بعد حذف الرقم لا يعود قادر على استقبل رسائل التحقق ايضا لا اعلم ما هو السبب

    هل يوجد حل لهذا المشكلة ؟

     

    هذا هو الكود الذي استخدمه :

    public class MainActivitytt extends AppCompatActivity {
    
    
        private Spinner spinner;
        private EditText editText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            spinner = findViewById(R.id.spinnerCountries);
            spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, CountryData.countryNames));
    
            editText = findViewById(R.id.editTextPhone);
    
            findViewById(R.id.buttonContinue).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String code = CountryData.countryAreaCodes[spinner.getSelectedItemPosition()];
    
                    String number = editText.getText().toString().trim();
    
                    if (number.isEmpty() || number.length() < 6) {
                        editText.setError("Valid number is required");
                        editText.requestFocus();
                        return;
                    }
    
                    String phoneNumber = "+" + code + number;
    
                    Intent intent = new Intent(MainActivitytt.this, VerifyPhoneActivity.class);
                    intent.putExtra("phonenumber", phoneNumber);
                    startActivity(intent);
    
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
    
            if (FirebaseAuth.getInstance().getCurrentUser() != null) {
                Intent intent = new Intent(this, ProfileActivitytt.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
                startActivity(intent);
            }
        }
    }
    public class VerifyPhoneActivity extends AppCompatActivity {
    
    
        private String verificationId;
        private FirebaseAuth mAuth;
        private ProgressBar progressBar;
        private EditText editText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_verify_phone);
    
            mAuth = FirebaseAuth.getInstance();
    
            progressBar = findViewById(R.id.progressbar);
            editText = findViewById(R.id.editTextCode);
    
            String phonenumber = getIntent().getStringExtra("phonenumber");
            sendVerificationCode(phonenumber);
    
            findViewById(R.id.buttonSignIn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    String code = editText.getText().toString().trim();
    
                    if (code.isEmpty() || code.length() < 6) {
    
                        editText.setError("Enter code...");
                        editText.requestFocus();
                        return;
                    }
                    verifyCode(code);
                }
            });
    
        }
    
        private void verifyCode(String code) {
            PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
            signInWithCredential(credential);
        }
    
        private void signInWithCredential(PhoneAuthCredential credential) {
            mAuth.signInWithCredential(credential)
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
    
                                Intent intent = new Intent(VerifyPhoneActivity.this, ProfileActivitytt.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
                                startActivity(intent);
    
                            } else {
                                Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                            }
                        }
                    });
        }
    
        private void sendVerificationCode(String number) {
            progressBar.setVisibility(View.VISIBLE);
            PhoneAuthProvider.getInstance().verifyPhoneNumber(
                    number,
                    60,
                    TimeUnit.SECONDS,
                    TaskExecutors.MAIN_THREAD,
                    mCallBack
            );
    
        }
    
        private PhoneAuthProvider.OnVerificationStateChangedCallbacks
                mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
    
            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                verificationId = s;
            }
    
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                String code = phoneAuthCredential.getSmsCode();
                if (code != null) {
                    editText.setText(code);
                    verifyCode(code);
                }
            }
    
            @Override
            public void onVerificationFailed(FirebaseException e) {
                Toast.makeText(VerifyPhoneActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        };
    }

     

    قمت بتجربة لحل  المشكلة باستخدام السطر التالي ولكن لم ينجح الامر 

     FirebaseAuth.getInstance().signOut();

     

    • أعجبني 1
  23. بتاريخ 19 ساعات قال Nezar Madi:

    الموجودات حاليا باقتين الباقة الأولى إسمها spark و هذه مجانية أم الباقة التانية إسمها blaze الإثنين تحصل على 10 ألاف عملية مجانا الفرق الرئيسي بينهم إن المجانية في حال وصلت للحد المجاني ستتوقف الخدمة أما التانية ستستكمل و على كل عملية زيادة ستسحب من رصيدك المبلغ الذي تم ذكره في التعليق السابق.

    شكرا على الإفادة ي غالي 

    • أعجبني 1
  24. بتاريخ 1 دقيقة مضت قال Nezar Madi:

    و عليكم السلام..

    لا عزيزي فهمك صحيح , تتحصل على 10 ألاف عملية تحقق مجانا كل شهر و ليس لمرة واحدة , إذا ما تجاوزت العشرة ألاف في أحد الشهور ستدفع 0.06 دولار عن كل عملية تحقق.

    ملاحظة : العمليات الناجحة فقط تحسب.

    طيب عزيزي بخصوص المبلغ الذي سوف أكون مجبور على دفعه لو كنت انا من باب التطوير ولكن سبحان الله تطبيقي وصل هذا العدد في شهر محدد رح يتم توقيف عملية التحقق الى ان يتم الدفع ام سأكون ملزم قانونيا اني أقوم بعملية الدفع ؟ مثلا انا لو وصل الى هذا العدد وحبيت الغي الخدمة حتى لا أقوم بعملية الدفع هل سينج الامر ام سيكون فيه بند قانوني ويتم محاسبتي عليه ؟

  25. السلام عليكم ورحمة الله وبركاته 

    احتاج افهم نقطة ي اخوان الي معه فكره حول الموضوع بخصوص خدمة  firebase OTP والتي من خلالها نستطيع التحقق من رقم الهاتف المسجل في التطبيق

    الذي فهمته يتم منح المطور 10k تحقق في كل شهر 

    كيف يتم احتساب 10k? هل هذا يعني انه في كل شهر يمكن ان اسجل في تطبيقي 10 الاف مستخدم ؟ بالمجاني وفي كل شهر جديد يتم منحي عشره غيرهم؟

    اما لها طريقة احتساب مختلفة ؟

    احس الرقم كبير شوية يعني على كذا مافيه احد محتاج يشتري منهم الخدمة او يعمل ترقية لنه 10 الاف مستخدم شهري رقم كبير ياليت احد يوضح الفكره يمكن يكون لدي سوى فهم للموضوع 

×
×
  • أضف...