3

我一直在爲Android 6開發一個應用程序部件,它的工作原理是每次廣播接收器接收到一個onUpdate時,它都會在更新RemoteView之前檢查權限,並使用適當的內容,比如說「權限失蹤「或任何它應該有的。是否有Android應用程序窗口小部件權限更改的監聽器?

但是,我注意到如果我通過系統>應用程序>權限禁用了我的應用程序所需的任何權限,則該過程在Studio中被標記爲「已死」。

如果我然後通過觸發一個onUpdate來測試widget是否仍然在模擬器中工作,果然它不再工作。只要我再次切換權限,就會生成一個新的進程ID,並且該小組件仍處於活動狀態並再次運行。

現在我的問題是,有沒有辦法捕捉到權限的變化?奇怪的是,當它根據Studio被認爲是「死」的時候,這個小部件在主屏幕上仍然「活着」(因爲權限發生變化,沒有錯誤出現).../

回答

0

對,我想我已經想通了這個問題...

當用戶進入手機的設置>應用程序>應用程序>權限然後撤消權限,最終會終止應用程序的進程 - 或者實際上它可能會被暫停,因爲只要您再次授予權限,同一進程(同一個PID)就會再次生效。

由於這個原因,小部件ID將丟失,因此onUpdate()在接收到廣播時不會被調用,並且所有添加到主屏幕的小部件都無法更新。

那麼,解決方法?

在調用super.onReceive()之前,獲取AppWidgetManager的新實例並手動將這些小部件ID放回Intent。然後,您將可以再次訪問所有小部件實例並相應地更新它們。

@Override 
public void onReceive(Context c, Intent i) { 

    String action = i.getAction(); 
    if (action.equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) { 
     ComponentName thiswidget = new ComponentName(c,  BroadcastHandler.class); 
     AppWidgetManager am = AppWidgetManager.getInstance(c); 
     int[] ids = am.getAppWidgetIds(thiswidget); 
     i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); 

     // either handle the permission change at this point or in onUpdate() 
    } 

    super.onReceive(c,i); 

} 

我不知道爲什麼谷歌不具備的權限撤銷聽衆說實話=/

0

我不是當然,如果那就是你正在尋找的東西,但我使用這段代碼來檢查權限。如果權限被拒絕,下次您使用該應用程序(我的情況下可穿戴應用程序),它會再次要求許可。

我在一個額外的類中使用了這個函數,所以也許你應該修改它以適應。

int permissionCheck = ContextCompat.checkSelfPermission(mainActivity, 
       Manifest.permission.RECORD_AUDIO); 

     if (permissionCheck != 0) { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       mainActivity.requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO, 
         Manifest.permission.INTERNET}, REQUEST_RECORD_AUDIO_PERMISSION); 
      } 
     } 

,以及您必須聲明最終的變數

private final int REQUEST_RECORD_AUDIO_PERMISSION=1; 

你有Manifest.permission更換線Manifest.permission.RECORD_AUDIO。(你的許可)

如果你想經常檢查權限 - 制定方法並在需要權限之前在代碼中使用它。

希望我可以幫助你

Birki

+0

的問題是是授予權限後會發生什麼。如果我通過手機的設置手動切換權限,則應用程序小部件將停止在主屏幕上工作,並且該過程顯示爲已死而沒有錯誤 - 這就是我想要捕捉的= / – Ken

相關問題