2015-07-19 137 views

回答

4

不,這是不可能的。你可以做的是發送一個通知,用戶可以點擊然後使用一個活動來請求/管理權限(也許用對話框主題)。

+1

配置活動也是處理這個問題的好地方。雖然用戶可以進入權限屏幕並撤銷之前給定的任何權限,但仍然需要通知方法。我還會考慮將這個小部件放入一個許可撤銷的UI狀態作爲替代方法。 –

1

您只能從活動或片段請求權限。

找出活動或片段中您感覺App需要許可的點,然後調用requestPermission方法。發送通知將不起作用,因爲您希望處理代碼,直到您獲得請求的權限,然後從onRequestPermissionResult()方法恢復您的功能。

4

我認爲這是可能要求許可的活動之外,只要你從支持庫使用的方法

ActivityCompat.requestPermissions (Activity activity, String[] permissions, int requestCode)

,並通過活動作爲方法的參數。

例如:

ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE); 

其中targetActivity是要實現該方法的活動:

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)

這將處理德許可請求結果的方法。

+16

活動之外意味着來自服務或廣播接收器,根本沒有活動。這個答案根本沒有幫助。 –

+0

通常,您可以將上下文對象傳遞給非活動類,並在需要上下文並且沒有活動時使用它。然而,要求權限是一個不同的故事。 – Pedram

+0

@加貝一方面你是正確的,但另一方面,這個問題並沒有指出提問者想要調用請求的位置。所以我認爲這是一個正確的答案。 – Opiatefuchs

8

如果您想要從活動外部請求許可,您可以創建不同的類並從活動中擴展該類。使用constructer來獲取和設置類的上下文。

public class Permissions extends Activity { 

private static final int MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 1; 
private Context context; 

public Permissions(Context context) { 
    this.context = context; 
} 
public void checkWriteExternalStoragePermission() { 
    final int MY_PERMISSIONS_REQUEST_PHONE_CALL = 1; 
    ContextCompat.checkSelfPermission(context,  Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions((Activity) context, 
       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 

     case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show(); 
      } 
      return; 

     } 
     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
} 

現在,創建創建對象並將上下文傳遞給需要請求權限的構造函數。

Permissions permissions = new Permissions(SplashScreen.this); 
    permissions.checkWriteExternalStoragePermission(); 
+3

但是,這種方法存在不利之處,即使在活動被銷燬之後,對象仍可能保留Activity上下文的引用,這可能導致內存泄漏。 –

+6

這是作弊。你的代碼實際上並沒有使用權限是一個活動的事實,因爲你不會將它傳遞給requestPermissions()。如果你這樣做,它會失敗。相反,您將給定的上下文傳遞給requestPermissions(),假設它是一個Activity。但問題的關鍵是,如果根本沒有活動,該怎麼辦? – Lev

+7

只是對那些不瞭解更好的人的警告,不要使用此代碼! –

-1

可以從您的活動外部調用requestPermissions(),但在您的類中您應該擁有該活動的上下文。

ActivityCompat.requestPermissions((Activity)context, new String[]{permission.READ_PHONE_STATE}, REQUEST_CODE); 

爲了工作,你應該實現以下方法,在您的活動

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) 

使這一重寫方法得到執行,當用戶水龍頭上允許或拒絕對彈出

0

按鈕您可以使用Easy Permissions庫。

Android要求這些請求來自Activity。通過輕鬆許可,這不再是一個問題,只要您提供Context,您可以從任何地方請求許可。另外,如果您請求已授予的權限,則不會提示用戶。

enter image description here

完全披露,公司管理和開發這個免費使用圖書館。這就是說,我們相信它是一個有用的工具,否則我們不會分享它。

+0

這對我沒有任何意義。如果Android真的需要使用活動來請求權限,那麼您的庫必須是純粹的魔術,因爲它可以做到不可能。事實是,你使用上下文。這與標準checkSelfPermission()一樣。我無法看到使用第三方庫進行此權限檢查的真正優勢。也許我想念一些東西... –

+0

@TheincredibleJan感謝您伸出援手。 Android需要一個「活動」。圖書館需要「上下文」,就像許多圖書館一樣 - 這是神奇的,但它仍然基於現實世界:)。最大的優點是你可以請求從任何地方啓用許可,即使是不是「活動」的類。此外,最新版本將允許您自動啓用「Manifest」文件中的所有權限。 GitHub頁面上有一個示例應用程序;如果你有幾分鐘,你一定要檢查出來。如果您還有其他問題,請告訴我們。 –