অ্যান্ড্রয়েড: getApplicationContext এর সাথে প্রগ্রেসডায়ালগ.শো () ক্র্যাশ হয়েছে


109

কেন ঘটছে তা আমি বুঝতে পারি না। এই কোড:

mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);

ঠিক কাজ করে। তবে, এই কোড:

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

নিম্নলিখিত ব্যতিক্রম নিক্ষেপ:

W/WindowManager(  569): Attempted to add window with non-application token WindowToken{438bee58 token=null}.  Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049):    at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049):    at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049):    ... 11 more

কোনো ধারণা আছে কেন এটি হছে? আমি এই onCreateপদ্ধতি থেকে কল করছি ।


আপনি ব্যবহার করে থাকেন Fragment, stackoverflow.com/questions/24825114/...
Yeo

উত্তর:


42

আপনি কোন এপিআই সংস্করণ ব্যবহার করছেন? সমস্যাটি কী তা সম্পর্কে আমি যদি ঠিক থাকে তবে এটি অ্যান্ড্রয়েড 1.6 (এপিআই সংস্করণ 4) এ ঠিক করা হয়েছিল।

দেখে মনে হচ্ছে অবজেক্ট রেফারেন্সটি getApplicationContext()কেবল নালার দিকে ফিরে যাচ্ছে। আমার মনে হয় আপনার মতো একটি সমস্যা onCreate()হ'ল উইন্ডোটি তৈরি হওয়ার আগেই কোডটির কিছু কোড চালানো হচ্ছে। এটি হ্যাক হতে চলেছে, তবে কয়েকশ মিলি সেকেন্ডে একটি নতুন থ্রেড চালু করার চেষ্টা করুন (আইআইআরসি: 300-400 আমার জন্য কাজ করেছে বলে মনে হচ্ছে, তবে আপনাকে টিঙ্কার লাগবে) যা আপনার অগ্রগতি ডায়ালগটি খোলে এবং আপনার প্রয়োজনীয় কিছু শুরু করে ( যেমন নেটওয়ার্ক IO)। এটার মতো কিছু:

@Override
public void onCreate(Bundle savedInstanceState) {
    // do all your other stuff here

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            mProgressDialog = ProgressDialog.show(
               YouTube.this.getApplicationContext(), "",
               YouTube.this.getString(R.string.loading), true);

            // start time consuming background process here
        }
    }, 1000); // starting it in 1 second
}

6
আমি ব্যবহার করছি 1.6। আমি নিশ্চিত যে ইউআই থ্রেডে কোনও ইউআই অপারেশন করা উচিত, সুতরাং আলাদা থ্রেডে প্রগ্রেসডায়ালগ.শো () কল করা সহজেই একটি বড় সমস্যা হতে পারে। তবুও ভাবুন এটি অদ্ভুত।
ফেলিক্স

3
উদাহরণ হিসাবে আমি দিয়েছি যে আপনি অন্য থ্রেডে ইউআই অপারেশন করছেন না, অন্য থ্রেডটি কেবল ডায়ালগটি খোলার জন্য ইউআই থ্রেডে ফিরে কল করছে।
জেরেমি লোগান

এটি অবশ্যই অদ্ভুত এবং এটি মোট হ্যাক, তবে এটি আমার পক্ষে কাজ করেছিল। আমি এটি ব্যবহার বন্ধ করতে পারি কিনা তা দেখতে আমার ১.6-এর মধ্যে থাকা বাগটি পরীক্ষা করতে হবে।
জেরেমি লোগান

1
এটি 'অদ্ভুত' বা এটি 'টোটাল হ্যাক' নয়, এটি পুরোপুরি বৈধ পদ্ধতির!
কমডোডেভ

1
@ কমোডো ডেভ আমি ঠিক বুঝতে পেরেছিলাম আমারও একই সমস্যা আছে। তবে খারাপ হ্যাকটি টাইমারটিতে রয়েছে। এটি এমন একটি সময় উইন্ডো যা কিছু পরিস্থিতিতে মাঝে মাঝে মাঝে ব্যর্থ হওয়ার অপেক্ষায়। সাফল্যের মূল চাবিকাঠিটি একটি সংক্ষিপ্ত টাইমার নির্ধারণের ক্ষেত্রে হতে পারে, অ্যাপ্লিকেশনটি প্রস্তুত কিনা তা পরীক্ষা করে দেখুন, ক্রিয়াটি না হওয়া পর্যন্ত পুনরায় খেলুন। সম্ভবত কতবার চেষ্টা করতে হবে তা সীমাবদ্ধ করুন।
জিম রাশ

129

আমি এপিআই লেভেল 7 এর সাথে অ্যান্ড্রয়েড সংস্করণ 2.1 ব্যবহার করছি I আমি এই (বা অনুরূপ) সমস্যার মুখোমুখি হয়েছি এবং এটি ব্যবহার করে সমাধান করেছি:

Dialog dialog = new Dialog(this);

এর পরিবর্তে:

Dialog dialog = new Dialog(getApplicationContext());

আশাকরি এটা সাহায্য করবে :)


4
আমার অনুরূপ সমস্যা ছিল তবে আমি একটি ক্রিয়াকলাপটি ব্যবহার করছিলাম। আমি এই ত্রুটিটি সমাধান করার একমাত্র উপায় হ'ল পরিবর্তে getParent () ব্যবহার করে।
ব্র্যাক

20
এটি কীভাবে তার প্রশ্নের উত্তর দেয়? তিনি জিজ্ঞাসা করেন যে দ্বিতীয়টি কেন কাজ করে না, যখন প্রথমটি কাজ করে।
বুখার্ড

3
-1, 'এটি' আমাদের মধ্যে কারও জন্য 'getApplicationContext ()' এর মতোই।
কেলোগগুলি

এখনও 2.1 এর জন্য বিকাশকারী একটি দরকারী টিপ
কার্লোস পি

64

আমার জন্য পরিবর্তন কাজ করে

builder = new AlertDialog.Builder(getApplicationContext());

প্রতি

builder = new AlertDialog.Builder(ThisActivityClassName.this);

অদ্ভুত বিষয়টি হ'ল প্রথমটি গুগল টিউটোরিয়ালে পাওয়া যায় এবং লোকেরা এতে ত্রুটি পায় ..


1
অনক্লিক ইভেন্টের ভিতরে কেবল সতর্কতার সাথে আমার জন্য কাজ করা সমাধান
টোবিয়াস

এটি করার সঠিক উপায় এটি। কঠোরভাবে প্রয়োজনীয় এবং সর্বোপরি যতক্ষণ না অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করবেন না এটি কখনও ইউআই উপাদান প্রদর্শন করতে ব্যবহার করবেন না। ক্রিয়াকলাপগুলি (এবং শেষ পর্যন্ত খণ্ডগুলি) এর জন্য।
মার্টিন মার্ককনসিনি

এটিই সেইটি. thisআপনি যদি এটির অভ্যন্তরে কাজ করে থাকেন তবে সমস্ত কিছুই একা কাজ করবে না, উদাহরণস্বরূপ, শ্রোতার উপর ক্লিক করুন।
আয়মান সালাহ

23

আমি মনে করি না যে এটি নাল অ্যাপ্লিকেশন প্রসঙ্গে একটি সময়সীমার সমস্যা

আপনার অ্যাপ্লিকেশনটির মধ্যে অ্যাপ্লিকেশন প্রসারিত করার চেষ্টা করুন (বা এটি ইতিমধ্যে যদি আপনার কাছে থাকে তবে এটি ব্যবহার করুন)

public class MyApp extends Application

উদাহরণটি প্রাইভেট সিঙ্গলটন হিসাবে উপলব্ধ করুন। এটি কখনই বাতিল হয় না

private static MyApp appInstance;

মাই অ্যাপে একটি স্থির সহায়ক করুন (যা সিঙ্গলটন ব্যবহার করবে)

    public static void showProgressDialog( CharSequence title, CharSequence message )
{
    prog = ProgressDialog.show(appInstance, title, message, true); // Never Do This!
}

গম্ভীর গর্জন !!

এছাড়াও, অ্যান্ড্রয়েড ইঞ্জিনিয়ারের উত্তরটি এখানে দেখুন: উইন্ডো ম্যানেজার $ BadTokenException

এই ত্রুটির একটি কারণ কোনও ক্রিয়াকলাপ নয় এমন একটি প্রসঙ্গের মাধ্যমে একটি অ্যাপ্লিকেশন উইন্ডো / সংলাপ প্রদর্শনের চেষ্টা করতে পারে।

এখন, আমি একমত, এটি যে কোনও ক্রিয়াকলাপের পরিবর্তে পদ্ধতিটি একটি প্রসঙ্গ প্যারাম নেয় তা বোঝা যায় না ..


10

উপরের উত্তরগুলি পড়ে আমি দেখতে পেলাম যে আমার পরিস্থিতির জন্য নিম্নলিখিতটি সমস্যার সমাধান করেছে।

এটি ত্রুটি ছুড়ে ফেলেছে

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(getApplicationContext());
        dialog.show();              
    }
});

পূর্ববর্তী উত্তরের উপর ভিত্তি করে যে প্রসঙ্গে প্রসঙ্গটি ভুল বলে প্রস্তাবিত হয়েছিল, আমি ক্লিক অ্যাপ্লিকেশন কনটেক্সট () পরিবর্তন করে ভিউ থেকে কনটেক্সটটি ক্লিক করে বোতামের অন ক্লিকের পদ্ধতিতে ফিরে পেয়েছি lick

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(v.getContext());
        dialog.show();              
    }
});

আমি জাভাটির কাজগুলি পুরোপুরি বুঝতে পারি না যাতে আমি ভুল হতে পারি, তবে আমি অনুমান করছি যে আমার নির্দিষ্ট পরিস্থিতির জন্য কারণটি সম্পর্কিত হতে পারে যে উপরের স্নিপেটটি একটি অ্যাবস্ট্রাক্ট ক্রিয়াকলাপ শ্রেণিতে সংজ্ঞায়িত করা হয়েছিল; অনেক ক্রিয়াকলাপ দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত এবং ব্যবহার করা হয়েছে, সম্ভবত এটি এটাকে অবদান রেখেছে যে getapplicationContext () কোনও বৈধ প্রসঙ্গ ফিরিয়ে দেয় না ?? (শুধু অনুমান)


ভাল স্কোর করা সমাধান সম্ভবত বেশিরভাগ ক্ষেত্রেই কাজ করে তবে আপনার v.getContext () কৌশলটি আমার মতো সবচেয়ে জেদী কেস সমাধান করে বলে মনে হচ্ছে। আমার ইমিরিক জাভা জ্ঞান আমাকে ভাবতে পরিচালিত করে যে কোনও অনক্রিট পদ্ধতিতে আগত প্রসঙ্গটি অনক্লিক পদ্ধতির ভিউ থেকে আসা প্রসঙ্গের মতো ঠিক নয়। ভোট দিন!
জোশ

এটা আমার দিন বাঁচায়!
আলেজান্দ্রো লুয়েংগো

6

আমি আইটেমযুক্ত ওভারলেগুলি সহ একটি মানচিত্রের ভিউ তৈরি করছি। আমি আমার মানচিত্রের ক্রিয়াকলাপ থেকে আমার আইটেমাইজড ওভারলিটি তৈরি করছিলাম:

OCItemizedOverlay currentLocationOverlay = new OCItemizedOverlay(pin,getApplicationContext);

আমি খুঁজে পেয়েছি যে আমি "android.view.WindowManager $ BadTokenException: উইন্ডো যুক্ত করতে অক্ষম - টোকেন নাল কোনও অ্যাপ্লিকেশনটির জন্য নয়" ব্যতিক্রম যখন আমার আইটেমাইজডোরোর অনট্যাপ পদ্ধতিটি ট্রিগার করা হয়েছিল (যখন অবস্থানটি মানচিত্রের সাথে ট্যাপ করা থাকে)।

আমি দেখতে পেয়েছি যে যদি আমি কেবল আমার নির্মাণকারীর কাছে 'getApplicationContext ()' এর পরিবর্তে 'এই' পাস করি, সমস্যাটি চলে যায়। এটি এলিয়েনজাজক্যাট-এর উপসংহারকে সমর্থন করে বলে মনে হচ্ছে। অদ্ভুত।


1
ধন্যবাদ, আমার সমস্যাটি এটাই ছিল।
কন

4

ট্যাব ক্রিয়াকলাপের মধ্যে প্রদর্শিত ক্রিয়াকলাপগুলির জন্য পিতামাতার () ব্যবহার করুন

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

পরিবর্তে

final AlertDialog.Builder builder = new AlertDialog.Builder(this);

3

Android 2.2 এর জন্য
এই কোডটি ব্যবহার করুন:

//activity is an instance of a class which extends android.app.Activity
Dialog dialog = new Dialog(activity);

পরিবর্তে এই কোড:

// this code produces an ERROR:
//android.view.WindowManager$BadTokenException: 
//Unable to add window -- token null is not for an application
Context mContext = activity.getApplicationContext();
Dialog dialog = new Dialog(mContext);

মন্তব্য: আমার কাস্টম ডায়ালগটি বাইরে activity.onCreateDialog(int dialogId)পদ্ধতির তৈরি হয়েছে।


3

চেষ্টা করুন -

AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

বর্তমান ক্রিয়াকলাপ কোনও ক্রিয়াকলাপের ভিতরে থাকা প্রয়োজন
htafoya

2

(সামঞ্জস্যতা) টুকরাগুলির সাথে একই ধরণের সমস্যা ছিল যার getActivity()মধ্যে ProgressDialog.show()এটির ব্যবহারের মাধ্যমে এটি ক্র্যাশ হয়। আমি রাজি হলাম এটি সময় করার কারণে is

একটি সম্ভাব্য সমাধান:

mContext = getApplicationContext();

if (mContext != null) {
    mProgressDialog = ProgressDialog.show(mContext, "", getString(R.string.loading), true);
}

পরিবর্তে ব্যবহার

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

প্রসঙ্গটি দখল করতে আরও সময় দেওয়ার জন্য যত তাড়াতাড়ি সম্ভব এমকনটেক্সট রাখুন। এটি কাজ করবে এমন কোনও গ্যারান্টি এখনও নেই, এটি ক্রাশের সম্ভাবনা হ্রাস করে। যদি এটি এখনও কাজ না করে, আপনাকে টাইমার হ্যাকের অবলম্বন করতে হবে (যা পরে ডায়ালগটি খারিজ করার মতো অন্যান্য সময়সীমার সমস্যার কারণ হতে পারে)।

অবশ্যই, আপনি যদি এটি ব্যবহার করতে পারেন thisবা ActivityName.this, এটি আরও স্থিতিশীল কারণ thisইতিমধ্যে কোনও কিছুর দিকে নির্দেশ করে। তবে কিছু ক্ষেত্রে যেমন নির্দিষ্ট খণ্ড আর্কিটেকচারের মতো এটি কোনও বিকল্প নয়।


2

(ভবিষ্যতের রেফারেন্সের জন্য)

আমি মনে করি এটি কারণ কারণ হিসাবে এখানে ব্যাখ্যা করা হয়েছে অ্যাপ্লিকেশন প্রসঙ্গে এবং ক্রিয়াকলাপের প্রসঙ্গে পার্থক্য রয়েছে: http://www.doubleencore.com/2013/06/context/

যার অর্থ আমরা অ্যাপ্লিকেশন প্রসঙ্গটি ব্যবহার করে ডায়ালগটি প্রদর্শন করতে পারি না। এটাই.


2

ক্রিয়াকলাপের অভ্যন্তরে ডায়লগ ব্যবহার করার জন্য, এটি এইভাবে করুন:

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     mContext = this;

     //using mContext here refering to activity context
     mBuilder = new AlertDialog.Builder(mContext);
     //...
     //rest of the code
     //...
}

টুকরো টুকরো ভিতরে ডায়লগ ব্যবহার করার জন্য, এটি এইভাবে করুন:

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View mRootView = inflater.inflate(R.layout.fragment_layout, container, false);
      mContext = getActivity();

      //using mContext here refering to fragment's hosting activity context
      mBuilder = new AlertDialog.Builder(mContext);
      //...
      //rest of the code
      //...
      return mRootView;
}

এটাই ^ _ ^ ^


1

আমি এগুলি পেতে যা করেছি তা হ'ল আমার সমস্ত ক্রিয়াকলাপের জন্য যেখানে আমি বিশ্বব্যাপী ডেটা সঞ্চয় করি তার জন্য একটি বেস ক্লাস তৈরি করা। প্রথম ক্রিয়াকলাপে, আমি আমার বেস ক্লাসের মতো একটি ভেরিয়েবলে প্রসঙ্গটি সংরক্ষণ করেছি:

বেস ক্লাস

public static Context myucontext; 

বেস ক্লাস থেকে প্রাপ্ত প্রথম ক্রিয়াকলাপ

mycontext = this

তারপরে আমি ডায়লগ তৈরি করার সময় getApplicationContext এর পরিবর্তে mycontext ব্যবহার করি।

AlertDialog alertDialog = new AlertDialog.Builder(mycontext).create();

লজ্জাজনক যে এই সমাধানটি আর কোনও আপ-ভোট পাবে না। এখানে উপস্থাপিত সমস্ত সম্ভাব্য সমাধানগুলির মধ্যে, এটিই কেবলমাত্র আমার জন্য অ্যাসিঙ্কটাস্কে কাজ করেছে
সি কেএন

1

যদি আপনি প্রগতিডায়ালগ.শো () কে কোনও খণ্ডে কল করে থাকেন তবে mContext এ ক্রিয়াকলাপটি আমার জন্য কাজ করেছে।

     ProgressDialog pd = new ProgressDialog((Activity) mContext);

1

এটি একটি সাধারণ সমস্যা। এর thisপরিবর্তে ব্যবহার করুন getApplicationContext() আপনার সমস্যার সমাধান করা উচিত


0

আমি বর্তমান অ্যাক্টিভিটি ভিউতে ব্যতিক্রম ব্যতীত সতর্কতা ডায়ালগটি বাস্তবায়িত করেছি hen যখনই আমি এই মত দিয়েছি

AlertDialog.Builder builder = new AlertDialog.Builder(context);

একই উইন্ডো ব্যতিক্রম দেওয়া হয়েছে onআনক্রিট () এর বাইরে সতর্কতার জন্য আমি কোড লিখি method আমি পদ্ধতিতে বিবৃতি context = this;দেওয়ার পরে খুব সহজ ব্যবহার করেছি context কনটেক্সট ভেরিয়েবলকে গ্লোবাল লাইক হিসাবে গ্রহণ করুনsetContentView()onCreate()Context context;

কোড নমুনা হয়

static Context context;

 public void onCreate(Bundle savedInstanceState)  { 
        super.onCreate(savedInstanceState); 


        setContentView(R.layout.network); 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        context = this;
.......

সতর্কতা পদ্ধতি নমুনা হয়

private void alertException(String execMsg){
        Log.i(TAG,"in alertException()..."+context);
        Log.e(TAG,"Exception :"+execMsg);
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
.......

এটি আমার পক্ষে ঠিক কাজ করে Aএখনত আমি স্ট্যাকওভারফ্লোতে এই ত্রুটিটি অনুসন্ধান করেছি আমি এই ক্যোয়ারীটি পেয়েছি this এই পোস্টটির সমস্ত প্রতিক্রিয়াগুলি পড়ার পরে, আমি এইভাবে চেষ্টা করেছি যাতে এটি কাজ করে I আমি মনে করি ব্যতিক্রমটি কাটিয়ে ওঠার এটি একটি সহজ সমাধান।

ধন্যবাদ, রাজেন্দ্র


0

গ্রুপঅ্যাক্টিভিটিতে আপনার যদি সমস্যা হয় তবে এটি ব্যবহার করবেন না। প্যারেন্ট হ'ল প্যারেন্ট অ্যাক্টিভিটি গ্রুপের একটি স্ট্যাটিক।

final AlertDialog.Builder builder = new AlertDialog.Builder(GroupActivityParent.PARENT);

পরিবর্তে

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

0

একটি ডায়ালগ সর্বদা ক্রিয়াকলাপের অংশ হিসাবে তৈরি এবং প্রদর্শিত হয়। আপনার অ্যাপ্লিকেশন প্রসঙ্গে পরিবর্তে কোনও ক্রিয়াকলাপ প্রসঙ্গে পাস করতে হবে।

http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.