はじめに

NativeScript で フォトライブラリの 画像や動画 を 参照/選択 する方法。

TL;DR

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. セットアップ
      1. インストール
      2. フォトライブラリ 利用時の許可文を設定(iOS)
    2. 実装
      1. ImagePicker 生成
      2. 権限要求/画像選択画面表示/画像選択
      3. サンプル
  5. まとめ
  6. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.3
BuildVersion: 19D76

$ node -v
v12.7.0

$ npm -v
6.10.3

$ tns --version
6.4.0

$ grep -C1 version package.json
"tns-ios": {
"version": "6.4.1"
},
"tns-android": {
"version": "6.4.1"
}

$ tns plugin
Dependencies:
┌───────────────────────────────┬─────────┐
│ Plugin │ Version │
│ @nativescript/theme │ ^2.2.1 │
│ @vue/devtools │ ^5.0.6 │
│ nativescript-barcodescanner │ ^3.4.1 │
│ nativescript-camera │ ^4.5.0 │
│ nativescript-fingerprint-auth │ ^7.0.2 │
│ nativescript-imagepicker │ ^7.1.0 │
│ nativescript-plugin-firebase │ ^10.4.0 │
│ nativescript-socketio │ ^3.2.1 │
│ nativescript-toasty │ ^1.3.0 │
│ nativescript-vue │ ^2.4.0 │
│ nativescript-vue-devtools │ ^1.2.0 │
│ tns-core-modules │ ^6.0.0 │
└───────────────────────────────┴─────────┘
Dev Dependencies:
┌────────────────────────────────────┬─────────┐
│ Plugin │ Version │
│ @babel/core │ ^7.0.0 │
│ @babel/preset-env │ ^7.0.0 │
│ babel-loader │ ^8.0.2 │
│ nativescript-dev-webpack │ ^1.0.0 │
│ nativescript-vue-template-compiler │ ^2.0.0 │
│ nativescript-worker-loader │ ~0.9.0 │
│ node-sass │ ^4.9.2 │
│ vue-loader │ ^15.4.0 │
└────────────────────────────────────┴─────────┘
  • iPhone 11 Pro: iOS 13.3
  • Android HUAWEI nova lite 2: Android 9 (ビルド 9.1.0.160)

詳細

リポジトリ: 17number/nativescript-vue-tutorial

参考コミット:

セットアップ

インストール

参考: Installation

1
$ tns plugin add nativescript-imagepicker

フォトライブラリ 利用時の許可文を設定(iOS)

app/App_Resources/iOS/Info.plist を編集
参考: Request permissions, show the images list and process the selection

1
2
3
4
5
6
7
8
 ...
<plist version="1.0">
<dict>
...
+ <key>NSPhotoLibraryUsageDescription</key>
+ <string>フォトライブラリ利用の詳細情報</string>
</dict>
</plist>

実装

ImagePicker 生成

create() で ImagePicker の生成。

1
2
import * as imagepicker from 'nativescript-imagepicker';
const context = imagepicker.create({ mode: 'single' });

指定可能なオプション
参考: Methods

1
2
3
4
5
6
7
8
9
10
11
12
import * as imagepicker from 'nativescript-imagepicker';
const context = imagepicker.create({
mode: 'single', // 'single' or 'multiple'(default)
minimumNumberOfSelection: 1, // 最小選択数(iOS のみ)
maximumNumberOfSelection: 3, // 最大選択数(iOS のみ)
showsNumberOfSelectedAssets: true, // 現在の選択枚数(iOS のみ)
prompt: 'please select', // 画像選択中に表示する文言(iOS のみ)
numberOfColumnsInPortrait: 4, // 1行に何枚並べるか(縦画面時、iOS のみ)
numberOfColumnsInLandscape: 7, // 1行に何枚並べるか(横画面時、iOS のみ)
mediaType: 'Any', // 'Image' or 'Video' or 'Any' (画像のみにしたい場合は 'Image' にする)
showAdvanced: false, // 外部ストレージ周りのオプション(Android のみ、非推奨?)
});

権限要求/画像選択画面表示/画像選択

authorize() で権限要求、present() で選択画面の表示、コールバック内で選択された画像の処理。

1
2
3
4
5
6
7
8
9
context.authorize()  // 権限要求
.then(() => context.present()) // OK の場合は画像選択画面の表示
.then(selection => { // 画像が選択されたらここで処理
console.log({selection});
selection.forEach(
selected => console.log({selected})
);
})
.catch(err => console.error({err})); // キャンセルされた場合にも通る

サンプル

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<template>
<Page @swipe="onSwipe">
<ActionBar title="Home"/>
<StackLayout>
<Button text="Select a photo" @tap="selectPhoto" />
<Image :src="image" v-if="image" />
</StackLayout>
</Page>
</template>

<script >
import * as imagepicker from 'nativescript-imagepicker';

export default {
name: 'home',
data() {
return {
image: null,
};
},
methods: {
selectPhoto() {
const context = imagepicker.create({ mode: 'single' });
context.authorize()
.then(() => context.present())
.then(selection => this.image = selection[0])
.catch(err => console.error({err}));
},
},
}
</script>
iOS

Android

まとめ

参考文献

関連記事