質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

820閲覧

カレンダー 予定 保存

jafirm

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2020/03/01 14:08

編集2020/03/05 10:11

カレンダーアプリを呼び出した後、そのまま自動で
保存できるようにしたいのですが、どのようにすればいいですか?

実行はされるのですが、
カレンダーアプリ見ても
2月21日7時30分に「タイトル」が保存されません。
アドバイスお願いします。

下記はパーミッションの確認のためのコードです。

public class MainActivity extends AppCompatActivity { private final int REQUEST_PERMISSION = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); readContentActivity(); } // Permissionの確認 public void checkPermission() { // 既に許可している if (checkSelfPermission(Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { requestLocationPermission(); } } // 許可を求める private void requestLocationPermission() { if (shouldShowRequestPermissionRationale( Manifest.permission.WRITE_CALENDAR)) { requestPermissions(new String[]{Manifest.permission.WRITE_CALENDAR}, REQUEST_PERMISSION); } else { Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません", Toast.LENGTH_SHORT); toast.show(); requestPermissions(new String[]{Manifest.permission.WRITE_CALENDAR,}, REQUEST_PERMISSION); } } // 結果の受け取り @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_PERMISSION) { // 使用が許可された if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { // それでも拒否された時の対応 Toast toast = Toast.makeText(this, "これ以上なにもできません", Toast.LENGTH_SHORT); toast.show(); } } }

下記がパーミッションの確認のコードの呼び出し、
そしてカレンダーを保存するためのコードで、
下のコードを実行して、カレンダーアプリで
確認するのですが、保存されていません。
なので下のコードを修正すべき箇所を
指摘してもらいたいです。

public void readContentActivity() { Calendar beginTime = Calendar.getInstance(); beginTime.set(2020, 2, 21, 7, 30); Calendar endTime = Calendar.getInstance(); endTime.set(2020, 2, 21, 8, 30); ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); values.put(Events.CALENDAR_ID, 1); values.put(Events.TITLE, "タイトル"); values.put(Events.DESCRIPTION, "説明"); values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID()); values.put(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); values.put(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); if (checkSelfPermission(Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { checkPermission(); } cr.insert(Events.CONTENT_URI, values); } }

以下から全文になります。
下記がMainActivity.javaです

package com.example.tera; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.Manifest; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.CalendarContract; import android.widget.Toast; import java.util.Calendar; import java.util.TimeZone; import android.provider.CalendarContract.Events; public class MainActivity extends AppCompatActivity { private final int REQUEST_PERMISSION = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); readContentActivity(); } // Permissionの確認 public void checkPermission() { // 既に許可している if (checkSelfPermission(Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { requestLocationPermission(); } } // 許可を求める private void requestLocationPermission() { if (shouldShowRequestPermissionRationale( Manifest.permission.WRITE_CALENDAR)) { requestPermissions(new String[]{Manifest.permission.WRITE_CALENDAR}, REQUEST_PERMISSION); } else { Toast toast = Toast.makeText(this, "許可されないとアプリが実行できません", Toast.LENGTH_SHORT); toast.show(); requestPermissions(new String[]{Manifest.permission.WRITE_CALENDAR,}, REQUEST_PERMISSION); } } // 結果の受け取り @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_PERMISSION) { // 使用が許可された if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { // それでも拒否された時の対応 Toast toast = Toast.makeText(this, "これ以上なにもできません", Toast.LENGTH_SHORT); toast.show(); } } } public void readContentActivity() { Calendar beginTime = Calendar.getInstance(); beginTime.set(2020, 2, 21, 7, 30); Calendar endTime = Calendar.getInstance(); endTime.set(2020, 2, 21, 8, 30); ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); values.put(Events.CALENDAR_ID, 1); values.put(Events.TITLE, "タイトル"); values.put(Events.DESCRIPTION, "説明"); values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID()); values.put(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); values.put(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); if (checkSelfPermission(Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { checkPermission(); } cr.insert(Events.CONTENT_URI, values); } }

下記がAndroidManifest.xmlです

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tera"> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

下記がactivity_main.xmlです(一応のせときます)

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> </androidx.constraintlayout.widget.ConstraintLayout>

以下が完成したうまくいったコードで上記のreadContentActivityを修正しました。

public void readContentActivity() { Calendar beginTime = Calendar.getInstance(); beginTime.set(2020, 2, 21, 7, 30); Calendar endTime = Calendar.getInstance(); endTime.set(2020, 2, 21, 8, 30); ContentResolver cr = getContentResolver(); ContentValues values = new ContentValues(); values.put(Events.CALENDAR_ID, 5); values.put(Events.TITLE, "タイトル"); values.put(Events.DESCRIPTION, "説明"); values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID()); values.put(Events.DTSTART, beginTime.getTimeInMillis()); values.put(Events.DTEND, endTime.getTimeInMillis()); if (checkSelfPermission(Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) { checkPermission(); } cr.insert(Events.CONTENT_URI, values); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakasho_dev

2020/03/01 16:23

[質問するときのヒント](https://teratail.com/help/question-tips)を良く読み分かりやすい質問にしましょう。コードは```で囲みましょう。 現在のコードでどこまでは正しく実装できていて、どこが自信ないのか等、かけるところはなるべく書いた方が回答者が回答しやすいと思います。
jimbe

2020/03/01 17:47

前回の回答にBAをして, また同じ内容を投稿されるのは何故でしょう. 先の回答が間違っていたのでしたら, そのようにコメントしてください.
jafirm

2020/03/02 10:28

すいません。 前の質問の内容はすべて修正して、 そのまま新しい回答がつくのをまっていたのですが、 新しい回答がつかなかったので、改めて質問することにしました。 初めてなので混乱を招く投稿をしてすいません。
退会済みユーザー

退会済みユーザー

2020/03/02 10:58

その使い方は回答がつかなくなります。
jafirm

2020/03/02 11:01

すいません。 以後気を付けます。
jimbe

2020/03/02 11:57 編集

それで, 「カレンダーアプリ」と言っておられるのは具体的に何というアプリでしょうか. 前回のご質問に回答しましたのは Googleカレンダーに対する登録方法の記事へのリンクでしたが, ご使用中のカレンダーは Googleカレンダーでは無いのでしょうか.
jafirm

2020/03/02 11:59

はい、Googleカレンダーです。
jimbe

2020/03/02 12:03

では, 実行に必要なコード(必要ならレイアウトXML等も含む)を全てご提示願えますか. こちらでも実行してみようと思います.
jafirm

2020/03/02 12:12

質問を修正して、全文載せました。 アドバイスお願いします。
jimbe

2020/03/02 13:08

ありがとうございます.
jafirm

2020/03/05 04:21

logcatでIDを確認したところ 2020-03-05 13:07:38.359 13885-13885/com.example.aw D/カレンダー: id=3, name='Contacts' 2020-03-05 13:07:38.361 13885-13885/com.example.aw D/カレンダー: id=4, name='日本の祝日' 2020-03-05 13:07:38.361 13885-13885/com.example.aw D/カレンダー: id=5, name=私のメールアドレスが記載 とでました。 DSTART,DENDに変え、IDもコメントアウトせず、変更したりしました。 3月21日を確認しましたが登録されておらず、念のため2月と4月そして、2019年 2021年も確認しましたが、登録されていませんでした。 大変お手数なのですが、もしよろしければ、パーミッションの確認も含む サンプルコードを示してもらえませんか? ※回答にコメントしたのですが、なかなか反映されないので、 こちらにコメントしました。
jimbe

2020/03/05 08:11 編集

私の回答のコメントのコードでその3件が表示されたのでしたら, ID=1 は無いことになります. 恐らく ID=5 が目的のカレンダーと思われますが, ID=5 としてお試しにはなられましたでしょうか. こちらでは, 新規のプロジェクトにご提示の MainActivity.java をコピペし, パッケージ名とカレンダーID, DTSTART/DTEND を変えたものを AndroidStudio から Xperia XZ3 (Android9) で実行しました. Manifest は READ_CALENDAR/WRITE_CALENDAR の uses-permission 2行の追加, レイアウトは何も無いようですのでプロジェクト作成時のままです. 確認は, パソコンで Web から Google カレンダーを見て行いました.
jafirm

2020/03/05 08:51

はい、IDは5で試しました。 Android studio から pixel 3a API 29 (android9とandroid10), 実機でXperia 5 (android10)で実行しました。 しかし、結果は変わらずです。
jafirm

2020/03/05 08:56

修正後の全文を質問を修正して載せますので、 見てもらえませんか?
guest

回答1

0

ベストアンサー

イベントの開始終了日時の指定を, CalendarContract.EXTRA_EVENT_BEGIN_TIME CalendarContract.EXTRA_EVENT_END_TIME ではなく, Events.DTSTART Events.DTEND としてください.

また, カレンダーid を 1 固定としていますが, それはあっているでしょうか.
書き込みたいカレンダーの id が 1 であるかを確認されていらっしゃいますか.

2月21日7時30分に「タイトル」が保存されません。

ということですが, Calender#set の月指定は 1月が0, 2月が1 ... ですので beginTime.set(2020, 2, 21, 7, 30) は 3月21日です.

投稿2020/03/02 13:02

編集2020/03/02 13:06
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jafirm

2020/03/02 15:27

IDをコメントアウトした場合、不具合はありますか? また、カレンダーIDというのはイベントごとの識別番号のようなものでしょうか?
jimbe

2020/03/05 08:12 編集

カレンダー ID は, カレンダー毎の識別番号のようなもので, 書き込み先のカレンダーを指定します. ですからコメントアウトしてはいけません. (イベント毎の識別番号のようなものは別にあります.) Google カレンダーには複数の「カレンダー」が作成できますが, 例えば私の Google カレンダーには「カレンダー」が5つ入っていて, id=1 は「日本の祝日」というカレンダーで, どこからか提供されているものです. (どう設定したのかは忘れました...) カレンダーIDは ContentResolver cr = getContentResolver(); try(Cursor cursor = cr.query(CalendarContract.Calendars.CONTENT_URI, new String[] { CalendarContract.Calendars._ID, CalendarContract.Calendars.NAME }, null, null, null);) { while(cursor.moveToNext()) { long id = cursor.getLong(0); String name = cursor.getString(1); Log.d("カレンダー", "id=" + id + ", name='" + name + "'"); } } といったコードで logcat で確認できます.
jafirm

2020/03/05 09:01

ごめんなさい。 なんか知らないけどいけました。
jafirm

2020/03/05 09:02

ありがとうございました。
jafirm

2020/03/05 09:08

なんか知らないけどといういい方は失礼でした。 ありがとうございました。
jimbe

2020/03/05 09:15

> なんか知らないけどいけました 弄っていたら…ということですね. 宜しかったら, その動作したコードを回答として載せてみては如何でしょうか.
jafirm

2020/03/05 10:04

わかりました。 最初何回実行して、何回も更新押したりしたんですが、 うまくいきませんでした。 ちなみに実行環境は pixel 3a API 29 (android10) と実機でxperia 5 (android10)です。
jimbe

2020/03/05 10:26

見た感じはやはり ID と時間を直したのみでしょうか. うまくいかなかったのが良く分かりませんね... 一つの確認方法として, 正常に登録が出来れば ContentResolver#insert が有効な Url を返すはずで, それを表示(log)するようにしておくと良いかと思います. 有効な Url であれば処理自体は成功していて, 例えばネットが原因で反映が遅れている等が考えられます. Url が null だったら失敗しているので, 何か処理的に問題があった(カレンダーIDが変わってしまって書き込めなかった等)が考えられます.
jafirm

2020/03/05 15:04

ご丁寧にありがとうございます。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問