2016-08-16 10 views
0

私は、ユーザーが自分の電話番号でログインできる「数字」を使用しています。それはTwitterによって提供されています。とにかく、私はAPIレベル23のために開発しているので、私はユーザーから連絡先を読む許可を要求する必要があります。私はonClick()メソッドをオーバーライドしています。これは実行時に許可を求めるために私に提供しています。しかし、私はコンストラクタのActivityをどのように渡すかわかりません。私は許可を要求するために活動を取得する必要があります

これは私がしてインスタンス化していたクラスです:

public class DigitsRegisterButton extends DigitsAuthButton { 

    final int loginPerm = 2; 
    LoginActivity activity; 

    public DigitsRegisterButton(Context c) { 
     super(c); 
     init(); 
    } 
    public DigitsRegisterButton(Context c, AttributeSet attrs) { 
     super(c, attrs); 
     init(); 
    } 

    public DigitsRegisterButton(Context c, AttributeSet attrs, int defStyle) { 
     super(c, attrs, defStyle); 
     init(); 
    } 

    @Override 
    public void onClick(View v) { 
     int loginPermissionCheck = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA); 
     if (loginPermissionCheck != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(/* Need Activity Here */, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, loginPerm); 
     } 
     super.onClick(v); 
    } 
} 

onClick()DigitsAuthButtonでオーバーライドされます:

@Override 
    public void onClick(View v) { 
     final DigitsAuthConfig digitsAuthConfig = digitsAuthConfigBuilder.build(); 
     getDigitsClient().startSignUp(digitsAuthConfig); 

     if (onClickListener != null) { 
      onClickListener.onClick(v); 
     } 
    } 

活動クラス:

public class LoginActivity extends AppCompatActivity implements LocationListener { 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login_nav_bar); 

     DigitsRegisterButton digitsButton = (DigitsRegisterButton) findViewById(R.id.account_auth_button); 
     digitsButton.setCallback(new AuthCallback() { 

      @Override 
      public void success(DigitsSession session, String phoneNumber) { 
       // TODO: associate the session userID with your user model 
       //username phone number, password is auth session 
       Toast.makeText(getApplicationContext(), "Authentication successful for " + phoneNumber, Toast.LENGTH_LONG).show(); 
       //new Login(getParentFragment(),) 
      } 

      @Override 
      public void failure(DigitsException exception) { 
       Log.d("Digits", "Sign in with Digits failure", exception); 
      } 
     }); 
    } 
+0

@SohailZahidこれから具体的に実装する必要があるのは何ですか?許可を求める必要があることはわかっていますが、アクティビティを延長しないクラスでリクエストしています。 –

+0

実行時アクセス許可はアクティビティ参照を開始する必要がありますので、アクティビティコードで取得してください。 –

+0

私はすでに同じものがここで一つの外観を持っていますhttp://stackoverflow.com/questions/38141523/directory-creation-not-working-in-marshmallow-android/38141778#38141778 –

答えて

0

私が要求して推薦しますボタンを有効にする前に許可してください。結局のところ、requestPermissions()は非同期で、super.onClick()に電話するとクラッシュすると思います。許可がない場合は(requestPermissions()onCreate()に)ボタンを無効にしてから、許可があればonRequestPermissionsResult()に有効にしてください。

IMHOは、GUIアーキテクチャーでコントローラ/プレゼンターのものであり、ビューのものではありません。

あなたのコメントに基づいて明確化

...

あなたはgetContext()を呼び出し、Activityすることをキャストすることができ、あなたの場合のように、それは実際にActivityです。

ただし、onClick()ロジックが壊れています。あなたが許可を持っていない場合は、あなたの質問にしているようにsuper.onClick()にチェーンすることはできません。結局のところ、許可を要求する背後にあるポイントは、では使用できないため、既存のボタンクリックロジックを使用するだけです。そうでないとクラッシュする可能性があります。そして、私が以前に指摘したように、requestPermissions()は非同期なので、あなたはrequestPermissions()が返す時刻までに許可を得ません。

あなたonClick()以上のように検討する必要があります:これは素晴らしい見ていないだろう

@Override 
public void onClick(View v) { 
    int loginPermissionCheck = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA); 
    if (loginPermissionCheck != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions((Activity)getContext(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, loginPerm); 
    } 
    else { 
     super.onClick(v); 
    } 
} 

、ボタンがクリックイベントに適切に応答しませんよう。

私はFabricについてよく分かりませんが、このボタンを使用する以外はこの認証を行う手段をいくつか提供しています。このボタンを使用すると、許可プロセスをより詳細に制御できます。さらに、Fabricはランタイム許可ロジックを処理するためのフックを提供できます。

+0

唯一の問題は、この1つのボタンにこの権限が必要なことです。私は、必要がなければ、許可を受け入れるようにユーザーに促す必要はありません。私はFacebookとGoogleを使ってユーザーにログインさせています。そのため、Googleでログインしたい場合、不要な許可を受け入れる必要はありません。 –

+0

@MatthewVedua:更新された回答を参照してください。 – CommonsWare

+0

ありがとうございました。残念ながら、私はダムです。この権限は、私が実装していない友人を見つけるために連絡先を共有したい場合にのみ必要です。ご迷惑おかけして申し訳ありません。 –

関連する問題