Flutter で Google drive の createdTime, modifiedTime を取得するには?

 

$fields を明示しないと取得できなかった。

Future<void> _test(String folderId) async {
  final jsonString = await rootBundle.loadString(
      'assets/google_sheet_auth.json');
  final jsonData = json.decode(jsonString);
  final credentials = ServiceAccountCredentials.fromJson(jsonData);
  final scopes = [
    drive.DriveApi.driveReadonlyScope,
    // drive.DriveApi.driveMetadataReadonlyScope,
    // SheetsApi.spreadsheetsReadonlyScope,
  ];
  final client = await clientViaServiceAccount(credentials, scopes);
  var driveApi = drive.DriveApi(client);

  drive.FileList files = await driveApi.files.list(
    q: "'$folderId' in parents",
    $fields: 'files(id, name, mimeType, createdTime, modifiedTime)',
  );
  for (drive.File file in files.files ?? []) {
    log.d('${file.name} createdTime: ${file.createdTime} modifiedTime: ${file.modifiedTime}');
  }

  try {
    final _file = await driveApi.files.get(folderId,
      $fields: 'files(id, name, mimeType, createdTime, modifiedTime)',
    ) as drive.File;
    // ファイル情報が取得できた場合の処理
    log.d('${_file.name} createdTime: ${_file.createdTime} modifiedTime: ${_file.modifiedTime} ');
  } catch (e) {
    // ファイルが見つからなかった場合やエラーが発生した場合の処理
    print('エラー: $e');
  }

  client.close();
}

 

ChatGPTに聞くと

google drive のファイルのタイムスタンプを取得する事はできますか?

はい、Google Driveのファイルのタイムスタンプを取得することは可能です。Google Drive APIを使用してファイルのメタデータを取得することで、ファイルの作成日時や最終更新日時などの情報を取得できます。

以下は、Google Driveファイルのメタデータを取得して、作成日時と最終更新日時を取得するDartコードの例です。

import 'package:googleapis/drive/v3.dart' as drive;
import 'package:googleapis_auth/auth_io.dart';

Future<void> getFileTimestamp(String fileId) async {
  final jsonString = await rootBundle.loadString('assets/google_sheet_auth.json');
  final jsonData = json.decode(jsonString);
  final credentials = ServiceAccountCredentials.fromJson(jsonData);
  final scopes = [drive.DriveApi.driveMetadataReadonlyScope];

  final client = await clientViaServiceAccount(credentials, scopes);
  final driveApi = drive.DriveApi(client);

  try {
    final file = await driveApi.files.get(fileId);
    final createdTime = file.createdTime;
    final modifiedTime = file.modifiedTime;

    print('ファイルの作成日時: $createdTime');
    print('ファイルの最終更新日時: $modifiedTime');
  } catch (e) {
    print('エラー: $e');
  } finally {
    client.close();
  }
}

void main() {
  getFileTimestamp('YOUR_GOOGLE_DRIVE_FILE_ID');
}

ってことで、上記では取得できませんでした。

Container(
          width: double.infinity,
          height: 1,
          color: Colors.black,
        ),

全体のソース

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Draw 3 Lines Across Screen Width'),
        ),
        body: Column(
          children: [
            SizedBox(height: 10,),
            Container(
              width: double.infinity,
              height: 5,
              color: Colors.blue,
            ),
            SizedBox(height: 10,),
            Container(
              width: double.infinity,
              height: 5,
              color: Colors.red,
            ),
            SizedBox(height: 10,),
            Container(
              width: double.infinity,
              height: 5,
              color: Colors.green,
            ),
          ],
        ),
      ),
    );
  }
}

flutterfire configure
FlutterAppRequiredException: The current directory does not appear to be a Flutter application project.

実行しているフォルダがプロジェクトのフォルダでは無いと言われるが、しかしフォルダは間違っていない

pubspec.yaml を見比べると

dependencies:
  flutter:       # add
    sdk: flutter  # add

ちょっと他と違ったので、2行追加 で正常に動作

flutter で、versionName versionCode の設定するには?

pubspec.yaml にて

# flutter で、versionName versionCode の設定する
version: 1.2.0+4

versionName が 1.2.0

versionCode が4 になります。

iOS だとbuild-name build-number となります。

コマンド実行で指定するには

flutter build appbundle --build-name=1.3.0 --build-number=4  
flutter build ios --build-name=1.3.0 --build-number=4

 

 

Module 'app_tracking_transparency' not found

flutter からの起動は正常なのに、xcode からだと基本的にライブラリーが見つからない!

Module ‘xxx’ not found

 

runner.xcworkspace を開く

build でビルド成功

 

Xcodeを14.3にアップデートしてからArchive 作成時

// Xcodeを14.3にアップデートしてからArchive
mkdir -p /Users/falco/Library/Developer/Xcode/DerivedData/Runner-bizyteowoysewphgsajrrszlkzyw/Build/Intermediates.noindex/ArchiveIntermediates/Runner/BuildProductsPath/Release-iphoneos/Runner.app/Frameworks
Symlinked...
rsync --delete -av --filter P .*.?????? --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "../../../IntermediateBuildFilesPath/UninstalledProducts/iphoneos/FMDB.framework" "/Users/falco/Library/Developer/Xcode/DerivedData/Runner-bizyteowoysewphgsajrrszlkzyw/Build/Intermediates.noindex/ArchiveIntermediates/Runner/InstallationBuildProductsLocation/Applications/Runner.app/Frameworks"
building file list ... rsync: link_stat "/Users/falco/AndroidProjects/SharedStudy/ios/../../../IntermediateBuildFilesPath/UninstalledProducts/iphoneos/FMDB.framework" failed: No such file or directory (2)
done

sent 29 bytes  received 20 bytes  98.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files could not be transferred (code 23) at /AppleInternal/Library/BuildRoots/aaefcfd1-5c95-11ed-8734-2e32217d8374/Library/Caches/com.apple.xbs/Sources/rsync/rsync/main.c(996) [sender=2.6.9]
Command PhaseScriptExecution failed with a nonzero exit code

bulid script を修正(source=”$(readlink “${source}”)”を検索)

if [ -L "${source}" ]; then
  echo "Symlinked..."
  # source="$(readlink "${source}")"
  source="$(readlink -f "${source}")"
fi

source=”$(readlink “${source}”)”

source=”$(readlink -f “${source}”)”

flutter で、Google fonts を使用するには?

font を選択

https://fonts.google.com/?subset=japanese

#pubspec.yml
dependencies:
  flutter:
    sdk: flutter

  google_fonts: ^3.0.1
// dart 

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Text with Background Image',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        // Google Font の名前を指定する
        textTheme: GoogleFonts.zenKakuGothicAntiqueTextTheme (
        Theme.of(context).textTheme,
        ),
      ),
      home: AutoPlayScreen(1),
    );
  }
}

 

flutter で、os 毎に処理を分岐するには?

import 'dart:io';

// ...

if (Platform.isAndroid) {
  // Android用の処理
} else if (Platform.isIOS) {
  // iOS用の処理
} else {
  // その他のプラットフォーム用の処理
}

wakelock ライブリをつかったらiOS だとエラーが発生して動作しなかった。

とりあえず必須でないので外す

2023-06-24 18:51:29.561174+0900 Runner[486:41614] Metal API Validation Enabled
2023-06-24 18:51:29.703009+0900 Runner[486:41614] [VERBOSE-2:FlutterDarwinContextMetalImpeller.mm(35)] Using the Impeller rendering backend.
2023-06-24 18:51:30.255519+0900 Runner[486:41912] flutter: The Dart VM service is listening on http://127.0.0.1:58922/2zlyqqf60mY=/
2023-06-24 18:51:30.882812+0900 Runner[486:41614] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSConcreteData getBytes:range:]: range {14, 1} exceeds data length 14'
*** First throw call stack:
(0x1922a725c 0x1a603c480 0x1934e2e70 0x100c76d84 0x100c75744 0x100c76cc0 0x100c75744 0x100c76564 0x100c728d0 0x1006ccb80 0x102dc7ae8 0x102dc932c 0x102dd776c 0x192226298 0x1922206f8 0x19221f7d0 0x1a8961570 0x194b4c2d0 0x194b5184c 0x100209a80 0x191efe140)
libc++abi: terminating with uncaught exception of type NSException
(lldb)

 

https://developer.yahoo.co.jp/webapi/jlp/furigana/v2/furigana.html

https://developer.yahoo.co.jp/webapi/jlp/sample/sample10.html

 

yahoo さんの API で 漢字にルビを振ってくれるAPIがありこれを使ってみます。

Andorid Text to Speech が日本語だとかなりへんてこりんな読み方をするので、漢字にルビを振って利用します。

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<List<String>> getFurigana(String text, String appId) async {
  final apiUrl = Uri.parse('https://jlp.yahooapis.jp/FuriganaService/V2/furigana');

  final requestBody = jsonEncode({
    'id': '1',
    'jsonrpc': '2.0',
    'method': 'jlp.furiganaservice.furigana',
    'params': {
      'q': text,
      'grade' : 1
    },
  });

  final response = await http.post(apiUrl, headers: {'Content-Type': 'application/json', 'User-Agent': 'Yahoo AppID: $appId'},body: requestBody);
  // print(response.body);
  final jsonData = jsonDecode(response.body);
  final wordList = jsonData['result']['word'] as List<dynamic>;
  // print(wordList);

  List<String> textList = [];
  String _text = '';
  for (var word in wordList) {
    var singleWord = word.containsKey('furigana') ? word['furigana'] : word['surface'];
    _text +=  singleWord;
    print (_text);
    // 改行文字を比較
    if (singleWord == '\n') {
      textList.add(_text);
      _text = '';
    }
  }
  return textList;
}

void main() async {
  const appId = ''; // 自分のアプリケーションIDに置き換えてください
  const text = '''
私はケンです。
私は学生です。
私は旅行者です。
''';

  final furiganaText = await getFurigana(text, appId);
  print(furiganaText);
}
// 結果
[わたしはケンです。
, わたしはがくせいです。
, わたしはりょこうしゃです。
]

response の json がいまいち直感的でない感じでした。

ChatGPT さんに相談しながら作りました。

2週間程つかってみましたが、かなりよい

Unity より画面はつくりやすく、なれると Native よりも簡単に作れる。

Android Native のエンジニアとして、iOS も Android も同時で開発出来るのは脅威!

 

以下は、wakelock ライブラリ使用時のエラー

 

flutter build エラー

FAILURE: Build failed with an exception.

* What went wrong:
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.5.20 and higher.
The following dependencies do not satisfy the required version:
project ‘:wakelock’ -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50

 

Flutter plugins/wakelock-0.4.0/build.gradle

buildscript {
    // ext.kotlin_version = '1.3.50'
    ext.kotlin_version = '1.7.10'

ext.kotlin_version = ‘1.7.10’ へ変更

© 2024 Falco Tech Blog Suffusion theme by Sayontan Sinha