2016-05-17 2 views
0

私のアプリにはレストランがリストされたRecyclerViewがあり、レストランには電話をかけるボタンがあります。ViewHolderからの通話の許可を要求する

電話は、23を除くすべてのAPIで機能します。問題は、アプリが電話をかける権限を要求する必要がありますが、これは非アクティビティクラスからはできません。

私はコンテキストを通過しようとしましたが、それは私のためには機能しませんでした。

レストランをCardViewにバインドする方法は次のとおりです。

public void bind(final Restaurant restaurant) { 
    name.setText(restaurant.getName()); 
    address.setText(restaurant.getAddress()); 
    city.setText(String.format("%05d %s (%s)", restaurant.getZip(), restaurant.getCity(), restaurant.getRegion())); 
    switch (restaurant.getCountry()) { 
     case "France": 
      country.setText(R.string.france); 
      break; 
     case "Spain": 
      country.setText(R.string.spain); 
      break; 
     case "Poland": 
      country.setText(R.string.poland); 
      break; 
     case "Portugal": 
      country.setText(R.string.portugal); 
    } 
    latitude = restaurant.getLatitude(); 
    longitude = restaurant.getLongitude(); 

    phoneCall.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+restaurant.getPhone())); 
      //     
      // Here I should request the permissions 
      // 
      v.getContext().startActivity(intent); 
     } 
    }); 

    navigation.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Uri gmmIntentUri = Uri.parse("google.navigation:q=" + latitude + "," + longitude); 
      Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); 
      mapIntent.setPackage("com.google.android.apps.maps"); 
      v.getContext().startActivity(mapIntent); 
     } 
    }); 
} 

事前に感謝

+0

Googleの "実行時の許可" –

答えて

0

インターフェイスを作成し、phoneCallクリックイベントをアクティビティに送信する必要があります。そこからアクセス許可をリクエストできます。私はあなたの答えを理解しているかどうかわからないんだけどActivityクラスから

サンプルコード

public class RecyclerAdapter extends RecyclerView.ViewHolder{ 
    private OnPhoneCallListener listener; 

    public void setListener(OnPhoneCallListener listener){ 
     this.listener = listener; 
    } 

    public void bind(final Restaurant restaurant) { 
      .......... 
      .......... 
      .......... 

     phoneCall.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(listener != null){ 
        listener.onPhoneCallClick(restaurant.getPhone()); 
       } 
      } 
     }); 

      .......... 
      .......... 
      .......... 
    } 
    public interface OnPhoneCallListener{ 
     void onPhoneCallClick(String phoneNumber); 
    } 
} 

// Register for callback event. 
RecyclerAdater.setListener(new OnPhoneCallListener(){ 

    @Override 
    public void onPhoneCallClick(String phoneNumber){ 
     //This portion will get execute when user will click on call button. 
     // Now here you can check for the permission, if it is granted, 
     // you can fire `ACTION_CALL` intent. 
    } 
}); 
+0

でチェックアウト。もう少し説明していただけますか? –

+0

@MiguelOrtegaサンプルコードを更新しました。コードを理解していただければ幸いです。 –

+0

あなたのソリューションは完璧に動作します、ありがとう! –

関連する問題