2016-05-16 5 views
0

私はかなりAndroidに新しくなりました。私はイベントを自動的に設定する1つのアプリケーションを開発しています。 これは私がRedMark コールはCalenderのコンテンツURIの許可を必要とします

Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI,values); 

ライン以下のエラーが コールがすべきuser.codeによって拒否することができる権限を必要と言っている取得していますhttp://developer.android.com/guide/topics/providers/calendar-provider.html

public boolean setReminder(int SelectedHour,int SelectedMinute,int NewHour,int NewMinute) 
{ 
    try{ 
     long calID = 3; 
     long startMillis = 0; 
     long endMillis = 0; 
     Calendar StartTime = Calendar.getInstance(); 
     StartTime.set(StartTime.YEAR,StartTime.MONTH,StartTime.DAY_OF_MONTH,SelectedHour,SelectedMinute); 
     startMillis = StartTime.getTimeInMillis(); 
     Calendar EndTime = Calendar.getInstance(); 
     int NewMonth = StartTime.MONTH+1;int NewDay = StartTime.DAY_OF_MONTH; 
     EndTime.set(StartTime.YEAR,NewMonth,NewDay,NewHour,NewMinute); 
     endMillis = EndTime.getTimeInMillis(); 

     TimeZone tz = TimeZone.getDefault(); 

     ContentResolver cr = getContentResolver(); 
     ContentValues values = new ContentValues(); 
     values.put(CalendarContract.Events.DTSTART, startMillis); 
     values.put(CalendarContract.Events.DTEND, endMillis); 
     values.put(CalendarContract.Events.TITLE, "Jazzercise"); 
     values.put(CalendarContract.Events.DESCRIPTION, "Group workout"); 
     values.put(CalendarContract.Events.CALENDAR_ID, calID); 
     values.put(CalendarContract.Events.EVENT_TIMEZONE, tz.getID()); 
     //Getting Problem in Line Below 
     Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI,values); 
     // get the event ID that is the last element in the Uri 
     long eventID = Long.parseLong(uri.getLastPathSegment()); 


     Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon(); 
     builder.appendPath("time"); 
     ContentUris.appendId(builder, startMillis); 
     Intent intent = new Intent(Intent.ACTION_VIEW).setData(builder.build()); 
     startActivity(intent); 
    return true; 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
     return false; 
    } 

を参照しています、私のコードです許可が利用可能かどうかを明示的に確認してください...

私はすでに追加済みです

私のマニフェストファイルにQRアプリケーションandroid.permission.ACCESS_COARSE_LOCATIONのようなイオンけれども、私のアプリケーションの実行が、私はテントカレンダーを呼び出すとき、それはをavailbleでない私にWebページを提供します。

は、私はまた、Adding events date and time in android calendar

が、まだその動作していないようにしようとしました。ユーザーが実行時にアプリに許可する必要があります許可を -

事前のおかげでは...

+0

なぜあなたのmanifeastに 'Location'権限を追加しますか? –

+0

この参照を確認してください:http://stackoverflow.com/questions/22990189/content-provider-grant-uri-permission?rq = 1 –

+0

マニフェストに追加する権限はありますか?私はまた、** android.permission.READ_CALENDAR **と** android.permission.WRITE_CALENDAR **を追加しました。 – Pranita

答えて

0

これは、あなたがアンドロイド> = 6でRuntime Permissionsを求めることができる機能を要求していることを意味します。正しいフローを実装する方法については、リンクをたどってください。

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.READ_CALENDAR) 
     != PackageManager.PERMISSION_GRANTED) { 

// Should we show an explanation? 
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
     Manifest.permission.READ_CALENDAR)) { 

    // Show an expanation to the user *asynchronously* -- don't block 
    // this thread waiting for the user's response! After the user 
    // sees the explanation, try again to request the permission. 

} else { 

    // No explanation needed, we can request the permission. 

    ActivityCompat.requestPermissions(thisActivity, 
      new String[]{Manifest.permission.READ_CALENDAR}, 
      MY_PERMISSIONS_REQUEST_READ_CALENDAR; 

    // MY_PERMISSIONS_REQUEST_READ_CALENDAR is an 
    // app-defined int constant. The callback method gets the 
    // result of the request. 
} 
}else{ 

Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI,values); 

} 
+0

変数は何ですか** MY_PERMISSIONS_REQUEST_READ_CALENDAR ** – Pranita

+0

宣言する必要がある定数です。たとえば、 プライベートfinal int MY_PERMISSIONS_REQUEST_READ_CALENDAR = 123; –

+0

もう一度同じ問題** Webページが利用できません** – Pranita

0

おそらく、このエラーは、予定表の権限がないために発生しています。マニフェストファイルにカレンダー権限を追加します。

android.permission.READ_CALENDAR

をカレンダーに書き込むには:カレンダーからの読み取りに

android.permission.WRITE_CALENDAR

+0

私はすでにこの2つのアクセス権を追加しました。 – Pranita

0

これはまだようですので、多くのコーダーに問題になる...ここで私の解決策: 私は相互作用を開始するボタンがありますwカレンダーこれは、最初に2つのボタンを備えたメッセージボックスを開き、ユーザはこれ以上の操作を許可する必要があります。クラスで

Permissions permissions; 

:彼は別のMessageboxはが表示され、カレンダー

private void addMessageBox() { 
    AlertDialog.Builder dlgAlert = new AlertDialog.Builder(getContext()); 
    dlgAlert.setMessage("Events mit lokalem Kalender synchronisieren?"); 
    dlgAlert.setTitle("Zugriff auf Kalender"); 
    dlgAlert.setCancelable(true); 


    dlgAlert.setPositiveButton("Erlauben", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        permissions = new Permissions(getActivity()); 
        if (!permissions.checkPermissionReadCalendar()) { 
         permissions.requestPermissionReadCalendar(Permissions.CALENDAR_PERMISSION_REQUEST_READ); 
        } else { 
         try { 
          addToLocalCalendar(); 
         } catch (ParseException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }); 
    dlgAlert.setNegativeButton("Verbieten", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        //return true; 
       } 
      }); 

    dlgAlert.create().show(); 
} 

の読み取り権限をユーザーに要求するだろうことができます場合、私は私がどこかにこのフォーラムで見つかったカスタムクラスと権限を制御します。

public class Permissions { 


public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_WRITE = 0; 
public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_READ = 1; 
public static final int CALENDAR_PERMISSION_REQUEST_READ = 2; 

Activity activity; 
Context mContext; 

public Permissions(Activity activity) { 
    this.activity = activity; 
    this.mContext = activity; 
} 



public boolean checkPermissionReadCalendar(){ 
    int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_CALENDAR); 
    if (result == PackageManager.PERMISSION_GRANTED){ 
     return true; 
    } else { 
     return false; 
    } 
} 

public void requestPermissionReadCalendar(int requestCode){ 
    if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.READ_CALENDAR)){ 
     Toast.makeText(mContext.getApplicationContext(), "Kalenderzugriff nicht möglich. Bitte erlaube Kalenderzugriff in den App Einstellungen.", Toast.LENGTH_LONG).show(); 
    } else { 
     ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.READ_CALENDAR},requestCode); 
    } 
} 

U何らかの形で書き込み許可を求める必要はありません...Appの設定では、カレンダーの権限は1つしかなく、uが読み取りまたは書き込みのアクセス権を持っている場合は許可されます。ユーザーは、彼はいつも、彼はこのアクションを行うには十分ではない権利を持っているトーストメッセージが表示されます許可を拒否した場合

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

:マニフェストでは、これを追加します。彼はAppの設定で手動で許可する必要があります。 そして、赤い下線部分については..それは、ユーザーが次のアクションを許可するかどうかを確認する必要があります。 uは、この行をクリックし、Altキー+このコードを入力しヒットした場合、挿入されます。ない場合はアプリケーションを許可してリターンを持っている場合

​​

これがチェックされます。

関連する問題