অ্যান্ড্রয়েড: উইন্ডো যুক্ত করতে অক্ষম। এই উইন্ডো প্রকারের জন্য অনুমতি অস্বীকৃত


86

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

তবে প্রতিবার আমার অ্যাপ্লিকেশনটি নিম্নলিখিত ত্রুটির সাথে ক্র্যাশ হয়ে গেছে:

android.view.WindowManager $ BadTokenException: উইন্ডো android.view.ViewRootImplootW@40ec8528 যুক্ত করতে অক্ষম - এই উইন্ডো প্রকারের জন্য অনুমতি অস্বীকার

এই পোস্টগুলি ( এখানে , এখানে এবং এখানে) ) সমস্ত একই উত্তর দেয়। ম্যানিফেস্ট ফাইলটিতে নিম্নলিখিত অনুমতি যুক্ত করতে।

android.permission.SYSTEM_ALERT_WINDOW

সমাধানটি আমি প্রয়োগ করেছি তবে আমি এখনও একই ত্রুটি পাচ্ছি। আমি কি ভুল করছি এর কোন ধারণা?

আমার প্রকাশিত ফাইলে অনুমতিগুলি এখানে রয়েছে:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droidpilot.keyguardwindow" >

<uses-sdk
    android:minSdkVersion="16"
    android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />

এবং আমি লক স্ক্রিনে উইন্ডোটি যুক্ত করতে এই কোডটি ব্যবহার করি

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    mView = mInflater.inflate(R.layout.lock_screen_notif, null);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT
    );

    wm.addView(mView, params);

কেউ ধারণা পেয়েছে?

পিএস আমি একটি এইচটিসি ডিজায়ার 620 ডিএসে অ্যান্ড্রয়েড 4.4.2 চালাচ্ছি testing

উত্তর:


31

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

আপনার ত্রুটির জন্য প্রযুক্তিগত কারণ হ'ল TYPE_KEYGUARD_DIALOGপতাকা ব্যবহার করা - এটির জন্য android.permission.INTERNAL_SYSTEM_WINDOWএকটি স্বাক্ষর-স্তরের অনুমতি প্রয়োজন। এর অর্থ হ'ল অনুমতিগুলির স্রষ্টার মতো একই শংসাপত্রের সাথে স্বাক্ষরিত অ্যাপসটি এটি ব্যবহার করতে পারে।

এর স্রষ্টা android.permission.INTERNAL_SYSTEM_WINDOW হ'ল অ্যান্ড্রয়েড সিস্টেম নিজেই, সুতরাং আপনার অ্যাপটি যদি ওএসের অংশ না হয়, তবে আপনি কোনও সুযোগেই দাঁড়াবেন না।

লকস্ক্রিন থেকে তথ্য ব্যবহারকারীর অবহিত করার জন্য সঠিকভাবে সংজ্ঞায়িত এবং ভালভাবে নথিভুক্ত উপায় রয়েছে । আপনি কাস্টমাইজড বিজ্ঞপ্তিগুলি তৈরি করতে পারেন যা লকস্ক্রিনে প্রদর্শিত হয় এবং ব্যবহারকারী তাদের সাথে যোগাযোগ করতে পারে।


4
ব্যক্তিগতভাবে আমি ফেসবুক অ্যাপের লক স্ক্রিন বিজ্ঞপ্তিগুলির মতো কিছু সন্ধান করছিলাম। আমি নতুন লক স্ক্রিন সংক্রান্ত বিজ্ঞপ্তিগুলি সম্পর্কে ইতিমধ্যে জানতাম তবে এগুলি আপাতত অ্যান্ড্রয়েড 22 এ কাজ করে। আমার এমন একটি সমাধান দরকার যা অ্যান্ড্রয়েড 16 এবং তারপরে ধরে কাজ করবে। তবে আপনার উত্তরটি সঠিকভাবে উপলব্ধি করে এবং আমি এটিকে গ্রহণ করব accept আমি লক স্ক্রিনে একটি উইন্ডো প্রদর্শন করতে পরিচালিত করেছি তবে এটি আমার যা প্রয়োজন তা নয়, আমি নীচের সন্ধানটি পোস্ট করব।
DroidPilot

4
অ্যাপ্লিকেশনগুলির যদি সেই অনুমতির প্রয়োজন হয় তবে এটি ইনস্টল ও খোলার পরে তা মঞ্জুরি দেওয়া যেতে পারে।
SkorpEN

আমি মনে করি যে Oreo থেকে এই অধিকার উত্তর stackoverflow.com/a/48481628/504179
Atom

108

আপনি যদি ব্যবহার করেন তবে ব্যবহার apiLevel >= 19করবেন না

WindowManager.LayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 

যা নিম্নলিখিত ত্রুটি পায়:

android.view.WindowManager $ BadTokenException: উইন্ডো android.view.ViewRootImplootW@40ec8528 যুক্ত করতে অক্ষম - এই উইন্ডো প্রকারের জন্য অনুমতি অস্বীকার

পরিবর্তে এটি ব্যবহার করুন:

LayoutParams.TYPE_TOAST or TYPE_APPLICATION_PANEL

4
ম্যানিফেস্টে মঞ্জুরিপ্রাপ্ত হয়ে আমি TYPE_SYSTEM_ALERTঅ্যান্ড্রয়েড 5.1 এ দুর্দান্ত কাজ করেছি android.permission.SYSTEM_ALERT_WINDOW
স্যাম

আমার সাথে ব্যবহার android.permission.SYSTEM_ALERT_WINDOWকরতে হবে LayoutParams.TYPE_TOAST?
t0m

4
আমি লেআউটপ্যারামগুলি চেষ্টা করেছি T এটি ললিপপ এবং মার্শমেলো উভয় এপিআই স্তর 6.0.1 এ আমার জন্য কাজ করছে। এর আগে আমি উইন্ডো ম্যানেজ.লায়আউটপ্যারাম ব্যবহার করছিলাম .YYTE_PYSYSTEM_ALERT, যা কেবলমাত্র ললিপপের জন্য কাজ করছিল।
প্রশান্ত

দুর্ভাগ্যক্রমে কিছু "অ্যাপ্লিকেশন অনুমতি ডায়লগ অনুরোধ" ক্ষেত্রে যদি আপনার স্ক্রিন ওভারলে সনাক্ত করা হয় (যদি আপনার দৃষ্টিভঙ্গি সক্রিয় থাকে)
সিয়েরেই

যদি আপনি কোনও পরিষেবা বা সম্প্রচারিত রিসিভারের মধ্যে থেকে উইন্ডোটি দেখানোর চেষ্টা করছেন তবে এটি কাজ করবে না
FindOutIslamNow

80

আমার ধারণা আপনার লক্ষ্যটি আলাদা করা উচিত (ওরিওর আগে এবং পরে)

int LAYOUT_FLAG;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
    LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
}

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    LAYOUT_FLAG,
    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT);

আমি অনুরূপ কৌশল ব্যবহার করার চেষ্টা করছি তবে অ্যান্ড্রয়েড স্টুডিওগুলি Build.VERSION_CODES.O& কে সনাক্ত করতে অক্ষম WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY। আমার টার্গেটএসডিভি ভার্সনটি 26
গ্যাবে

আমার পক্ষ থেকে আপনার সহায়তা +1 এর প্রশংসা করুন।
সেভেন

@ গ্যাবেও'লারি আমিও একই সমস্যার মুখোমুখি হচ্ছি, আপনার কি এর সমাধান আছে?
সাগর

51

আমি এই ইস্যুটির জন্য উপলব্ধ সমস্ত উদাহরণ চেষ্টা করার চেষ্টা করেছি। অবশেষে আমি এর উত্তর পেয়েছি আমি জানি এটি কতটা নির্ভরযোগ্য তবে আমার অ্যাপটি এখন ক্র্যাশ হচ্ছে না।

windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    //here is all the science of params
    final LayoutParams myParams = new LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
            PixelFormat.TRANSLUCENT
    );

আপনার মেনিফেস্ট ফাইলে কেবল অনুমতি দিন

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

এটির সাথে যুক্ত করে আপনি তার API = = 23 এর পরে স্তরটিও যাচাই করতে পারেন

 if(Build.VERSION.SDK_INT >= 23) {
    if (!Settings.canDrawOverlays(Activity.this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, 1234);
    }
}
            else
{
    Intent intent = new Intent(Activity.this, Service.class);
    startService(intent);
}

আমি আশা করি এটি কোথাও কাউকে সাহায্য করবে। সম্পূর্ণ উদাহরণ https://anam-android-codes.blogspot.in/?m=1


13

8.0.0 এর অ্যান্ড্রয়েড এপিআই স্তরের জন্য আপনার ব্যবহার করা উচিত

WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

পরিবর্তে

LayoutParams.TYPE_TOAST or TYPE_APPLICATION_PANEL

বা SYSTEM_ALERT


TYPE_APPLICATION_OVERLAY Android স্টুডিওতে উপস্থাপিত বিকল্পগুলির তালিকায় নেই। আমি "প্রতীক প্রকারটি সমাধান করতে পারি না" পেয়েছি। আমি কী মিস করছি?
ফিলক্রুজ

11

এই কোড নিখুঁতভাবে কাজ চেষ্টা করুন

int layout_parms;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 

    {  
         layout_parms = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

    }

     else {

            layout_parms = WindowManager.LayoutParams.TYPE_PHONE;

    }

    yourparams = new WindowManager.LayoutParams(       
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            layout_parms,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

আপনি আমার জীবন বাঁচিয়েছেন
Fo Nko

@ বাকাওয়াই যেখানে আপনি এই কোডটি রাখার জন্য উইজেট প্রদর্শন করতে চান সেখানে দুর্দান্ত কাজ করবে
শাকিরুল্লাহ ওরাকজাই

6

অনুসন্ধান করুন

অন্যান্য অ্যাপ্লিকেশনগুলির উপরে আঁকুন

আপনার সেটিং এ এবং আপনার অ্যাপ্লিকেশন সক্ষম। অ্যান্ড্রয়েড 8 ওরিওর জন্য, চেষ্টা করুন

সেটিংস> অ্যাপ্লিকেশন এবং বিজ্ঞপ্তিগুলি> অ্যাপ্লিকেশন তথ্য> অন্যান্য অ্যাপ্লিকেশনগুলির উপরে প্রদর্শন করুন> সক্ষম করুন


4
আপনি একজন জীবনদাতা
নূর হোসেন

5

প্রথমত আপনি নিশ্চিত করেছেন যে ম্যানিফেস্ট ফাইলে আপনার অনুমতি রয়েছে।

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

অ্যাপ্লিকেশনটিতে অন্যান্য অ্যাপ্লিকেশনগুলির অনুমতি রয়েছে কিনা তা পরীক্ষা করুন? এই অনুমতিটি ডিফল্টভাবে API <23 এর জন্য উপলব্ধ। তবে এপিআই> 23 এর জন্য আপনাকে রানটাইমে অনুমতি চাইতে হবে।

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {

    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 1);
} 

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

public class ChatHeadService extends Service {

private WindowManager mWindowManager;
private View mChatHeadView;

WindowManager.LayoutParams params;

public ChatHeadService() {
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();

    Language language = new Language();
    //Inflate the chat head layout we created
    mChatHeadView = LayoutInflater.from(this).inflate(R.layout.dialog_incoming_call, null);


    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
        params.x = 0;
        params.y = 100;
        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mWindowManager.addView(mChatHeadView, params);

    } else {
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                PixelFormat.TRANSLUCENT);


        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
        params.x = 0;
        params.y = 100;
        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mWindowManager.addView(mChatHeadView, params);
    }

    TextView tvTitle=mChatHeadView.findViewById(R.id.tvTitle);
    tvTitle.setText("Incoming Call");

    //Set the close button.
    Button btnReject = (Button) mChatHeadView.findViewById(R.id.btnReject);
    btnReject.setText(language.getText(R.string.reject));
    btnReject.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //close the service and remove the chat head from the window
            stopSelf();
        }
    });

    //Drag and move chat head using user's touch action.
    final Button btnAccept = (Button) mChatHeadView.findViewById(R.id.btnAccept);
    btnAccept.setText(language.getText(R.string.accept));


    LinearLayout linearLayoutMain=mChatHeadView.findViewById(R.id.linearLayoutMain);



    linearLayoutMain.setOnTouchListener(new View.OnTouchListener() {
        private int lastAction;
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:

                    //remember the initial position.
                    initialX = params.x;
                    initialY = params.y;

                    //get the touch location
                    initialTouchX = event.getRawX();
                    initialTouchY = event.getRawY();

                    lastAction = event.getAction();
                    return true;
                case MotionEvent.ACTION_UP:
                    //As we implemented on touch listener with ACTION_MOVE,
                    //we have to check if the previous action was ACTION_DOWN
                    //to identify if the user clicked the view or not.
                    if (lastAction == MotionEvent.ACTION_DOWN) {
                        //Open the chat conversation click.
                        Intent intent = new Intent(ChatHeadService.this, HomeActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);

                        //close the service and remove the chat heads
                        stopSelf();
                    }
                    lastAction = event.getAction();
                    return true;
                case MotionEvent.ACTION_MOVE:
                    //Calculate the X and Y coordinates of the view.
                    params.x = initialX + (int) (event.getRawX() - initialTouchX);
                    params.y = initialY + (int) (event.getRawY() - initialTouchY);

                    //Update the layout with new X & Y coordinate
                    mWindowManager.updateViewLayout(mChatHeadView, params);
                    lastAction = event.getAction();
                    return true;
            }
            return false;
        }
    });
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mChatHeadView != null) mWindowManager.removeView(mChatHeadView);
}

}


4
আপনি কি আপনার এক্সএমএল কোডটি ভাগ করে নিতে পারেন এবং গিথুব বা অন্য কোনও কিছুতে এটি দেখতে আমার পক্ষে সহায়ক হবে।
প্যাভেল

4

অ্যান্ড্রয়েড ওয়ের সাথে সামঞ্জস্যপূর্ণ করতে আপনার প্রকল্পে আপনার উইন্ডোম্যাঞ্জার পতাকাটি "TYPE_SYSTEM_OVERLAY" "TYPE_APPLICATION_OVERLAY" তে পরিবর্তন করুন

WindowManager.LayoutParams.TYPE_PHONE প্রতি WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY


3

আমি শেষ পর্যন্ত এর TYPE_SYSTEM_OVERLAYপরিবর্তে লক স্ক্রিনে একটি উইন্ডো প্রদর্শন করতে পরিচালনা করেছি TYPE_KEYGUARD_DIALOG। এটি প্রত্যাশার মতো কাজ করে এবং লক স্ক্রিনে উইন্ডো যুক্ত করে।

এটির সাথে সমস্যাটি হ'ল উইন্ডোটি যতটা সম্ভব পারে তার উপরে যুক্ত করা হয়।এটি হ'ল সুরক্ষিত লক স্ক্রিনের ক্ষেত্রে উইন্ডোটি আপনার কীপ্যাড / প্যাটার্ন লকের উপরে উপস্থিত হবে। কোনও অনিরাপদ লক স্ক্রিনের ক্ষেত্রে, আপনি যদি লক স্ক্রীন থেকে এটি খুলেন তবে এটি বিজ্ঞপ্তি ট্রেটির উপরে উপস্থিত হবে।

আমার জন্য, এটি অগ্রহণযোগ্য। আমি আশা করি এটি এই সমস্যার মুখোমুখি অন্য কাউকে সহায়তা করতে পারে।


সমাধানের জন্য আপনাকে অনেক ধন্যবাদ। এটিকে বরখাস্ত করার কোনও উপায় আছে কি? আমি যখন ডায়ালগটি যুক্ত করি তখন তা খারিজ করতে পারছি না TYPE_SYSTEM_OVERLAY। সতর্কতা ডায়ালগ-এ আমার সেটঅনিজমিসলিজার অনুরোধ করা হচ্ছে না।
টম টেলর

3

আমি স্রেফ সহজ ভিউ এ যুক্ত করেছি WindowManager নিম্নলিখিত পদক্ষেপগুলি সহ :

  1. দেখানোর জন্য একটি লেআউট ফাইল তৈরি করুন (আমার ক্ষেত্রে ডামি_আউটআউট)
  2. প্রকাশ্যে এবং গতিশীলভাবে অনুমতি যুক্ত করুন permission
// 1. Show view
private void showCustomPopupMenu()
{
    windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
    // LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    // View view = layoutInflater.inflate(R.layout.dummy_layout, null);
    ViewGroup valetModeWindow = (ViewGroup) View.inflate(this, R.layout.dummy_layout, null);
    int LAYOUT_FLAG;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    } else {
        LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
    }
    WindowManager.LayoutParams params=new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        LAYOUT_FLAG,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT);

    params.gravity= Gravity.CENTER|Gravity.CENTER;
    params.x=0;
    params.y=0;
    windowManager.addView(valetModeWindow, params);
}

// 2. Get permissions by asking
if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 1234);
}

এটির সাহায্যে আপনি ডাব্লুএম-এ একটি ভিউ যুক্ত করতে পারেন।

পাইতে পরীক্ষিত।


2

লেআউটপ্যারামস T আমি এই মত আমার কোড আপডেট করেছি।

parameters = if (Build.VERSION.SDK_INT > 25) {
        LayoutParams(
                minHW * 2 / 3, minHW * 2 / 3,
                LayoutParams.TYPE_APPLICATION_OVERLAY,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT)
    }else {
        LayoutParams(
                minHW * 2 / 3, minHW * 2 / 3,
                LayoutParams.TYPE_PHONE,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT)
    }

লেআউটপ্যারামস T TYPE_APPLICATION_OVERLAY এপিআই স্তর 26 বা ততোধিক প্রয়োজন।


0

অনুমতি অস্বীকার করার মূল কারণটি হ'ল আমাদের কাছে অন্য অ্যাপ্লিকেশনগুলিতে অঙ্কনের অনুমতি নেই, নিম্নলিখিত কোডের সাহায্যে অন্যান্য অ্যাপ্লিকেশনগুলিতে অঙ্কনের জন্য আমাদের অনুমতি দিতে হবে

অনুমতি জন্য অনুরোধ কোড

    public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;

আপনার এই অ্যাড MainActivity


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
            askPermission();
}


private void askPermission() {
        Intent intent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+getPackageName()));
        startActivityForResult(intent,ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}

এটিও যুক্ত করুন

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE){
            if(!Settings.canDrawOverlays(this)){
                askPermission();
            }
        }
    }


0

আমি সঙ্গে কাজ সমাধান খুঁজে বের করার লড়াই ApplicationContextএবং TYPE_SYSTEM_ALERTএবং সমাধান বিভ্রান্তিকর পাওয়া যায় নি, যদি আপনি চান ডায়ালগ কোনো কার্যকলাপ থেকে খুলে দেয়া উচিত এমনকি ডায়ালগ একটি আপনি ব্যবহার করতে হবে Singleton getApplicationContext(), এবং যদি আপনি চান ডায়ালগ হওয়া উচিত TYPE_SYSTEM_ALERTআপনি নিম্নোক্ত পদক্ষেপসমূহ প্রয়োজন হবে :

প্রথমে সঠিক থিম সহ কথোপকথনের উদাহরণটি পান, এছাড়াও আপনাকে আমার নিম্নলিখিত স্নিপেটে যেমন সংস্করণ সামঞ্জস্যতা পরিচালনা করতে হবে:

AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext(), R.style.Theme_AppCompat_Light);

শিরোনাম, বার্তা এবং বোতামগুলি সেট করার পরে আপনাকে ডায়ালগটি তৈরি করতে হবে:

AlertDialog alert = builder.create();

এখন typeনাটকগুলি এখানে মূল রোলটি খেলছে, যেহেতু এটি ক্রাশের কারণ, তাই আমি সামঞ্জস্যতাটিকে নিম্নলিখিত হিসাবে পরিচালনা করেছি:

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        alert.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    }

দ্রষ্টব্য : আপনি যদি AppCompatDialogনীচের মতো কাস্টম ডায়ালগ ব্যবহার করে থাকেন:

AppCompatDialog dialog = new AppCompatDialog(getApplicationContext(), R.style.Theme_AppCompat_Light);

আপনি AppCompatDialogউদাহরণস্বরূপ আপনার ধরনটি সরাসরি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করতে পারেন :

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - 1);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    }

প্রকাশের অনুমতি যোগ করতে ভুলবেন না:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

0
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.START | Gravity.TOP;
    params.x = left;
    params.y = top;
    windowManager.addView(view, params);

} else {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);


    params.gravity = Gravity.START | Gravity.TOP;
    params.x = left;
    params.y = top;
    windowManager.addView(view, params);
}

0

WindowManager.LayoutParams.TYPE_SYSTEM_ERRORওএস সংস্করণ <ওরিওর হিসাবে হ্রাস পেয়েছে বলে নিশ্চিত করুন ।

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