2015-09-18 35 views
13

Sistem yerleşimi oluşturmaya çalışıyorum. Ancak "izin reddedildi" almaya devam ediyorum. Ben SDK sürümü kullanıyorum 23.Android Sistem kaplama penceresi

Benim bildirim dosyası:

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

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

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".activity.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

Ben bindirme oluşturmak için kullandığınız kod:

//mView = new HUDView(this); 
    mButton = new Button(this); 
    mButton.setText("Overlay button"); 
    mButton.setOnTouchListener(this); 

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
      PixelFormat.TRANSLUCENT); 
    params.gravity = Gravity.RIGHT | Gravity.TOP; 
    params.setTitle("Load Average"); 
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
    wm.addView(mButton, params); 
+0

için çalışacaktır. Olası kopyası [Bu pencere türü için [email protected] - pencere eklenemedi.] (Http: // stackoverflow .com/questions/7569937/yapamaz-add-window-android-view-viewrootw44da9bc0-izin-reddedildi-için-t) – ceph3us

cevap

23

Birincisi, SYSTEM_OVERLAY_WINDOW adında herhangi bir izin yoktur. Bu, SYSTEM_ALERT_WINDOW.

İkinci olarak, targetSdkVersion saatiniz 23 veya daha yüksekse ve Android 6.0 ve üzeri sürümlerde çalışıyorsanız, uygulamanız en baştan bu izni almayacaktır. İzne sahip olup olmadığınızı görmek için Settings.canDrawOverlays() numaralı telefonu arayın ve bunu yapmazsanız, kullanıcıyı Ayarlar'a yönlendirmek için ACTION_MANAGE_OVERLAY_PERMISSION kullanın.

+0

SYSTEM_ALERT_WINDOW izni değiştirdim ama bu sorunu çözmedi. Bu yüzden ikinci önerinizi uygulamaya çalışıyorum. Ancak, kullanıcıyı Ayarlar'a yönlendirmek için ACTION_MANAGE_OVERLAY_PERMISSION özelliğini nasıl kullanırım? – Tom

+1

@VeryEvilBetty: Bu bir "niyet" eylemidir. startActivity (yeni Intent (Settings.ACTION_MANAGE_OVERLAY_PERMISSION)), kullanıcının uygulamanızın ekran üzerinden çizim yapmasına izin vermeyi seçebileceği bir etkinlik oluşturmalıdır. – CommonsWare

+0

Teşekkürler, şimdi çalışıyor. – Tom

16

AndroidManifest yılında

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


public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE= 5469; 
//Random value 

    public void testPermission() { 
     if (!Settings.canDrawOverlays(this)) { 
      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 
        Uri.parse("package:" + getPackageName())); 
      startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE); 
     } 
    } 

Sonucu (sürümüne < 23 için):

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) { 
     if (Settings.canDrawOverlays(this)) { 
      // You have permission 
     } 
    } 
} 
+0

API v23 için aynısını yapabileceğimizi söylüyor, bu kodu 23 üzerinde denediniz mi? http://developer.android.com/reference/android/provider/Settings.html#canDrawOverlays(android.content.Context) – MBH

+0

Evet yapabilirsin. Bildiride izin yalnızca <23 sürümü içindir, Çalışma Zamanı sorgusu nedeniyle sürüm 23 için göz ardı edilir. Anwser'imin reste'si her ikisi için de geçerli. – Anthone

+0

Çalışma zamanı izinleri listesini kontrol ettim, SYSTEM_ALERT_WINDOW listede yok. İzin vermek için kullanıcıya rehberlik etmenin tek yolu sanırım! – MBH

0

Ayrıca, belirli uygulamanın üstlerinde bir sayfaya üzerinde kullanıcıyı yol açabilir. dokümantasyon states:

Girdi: İsteğe bağlı olarak, niyet veri URI doğrudan paket ismi olarak belirli yönetim GUI çağırmak için uygulama paketi adını belirtebilirsiniz. Örneğin "paket: com.my.app".

Yani böyle bir şey: Alternatif bir çözüm olarak

intent.setData(Uri.fromParts("package", getPackageName(), null)); 
0

, bunun yerine WindowManager.LayoutParams.TYPE_SYSTEM_ALERT ait WindowManager.LayoutParams.TYPE_TOAST deneyebilirsiniz. Bu, herhangi bir izin gerektirmez. Resim göstermek için kullanıyorum, belki düğme

İlgili konular