nativescript-imagepicker icon indicating copy to clipboard operation
nativescript-imagepicker copied to clipboard

JS: TypeError: Cannot read property 'startActivityForResult' of undefined

Open aubrey-fowler opened this issue 4 years ago • 0 comments

I'm working on an app with Angular 8.2.0 and NS 6.8.0.

tns info

✔ Getting NativeScript components versions information...
✔ Component nativescript has 7.0.11 version and is up to date.
✔ Component tns-core-modules has 6.5.24 version and is up to date.
⚠ Update available for component @nativescript/core. Your current version is 6.5.24 and the latest available version is 7.0.13.
✔ Component tns-ios has 6.5.3 version and is up to date.
✔ Component tns-android has 6.5.3 version and is up to date.

Here is my package.json file:

{
    "nativescript": {
        "id": "org.nativescript.MyApp",
        "tns-android": {
            "version": "6.5.3"
        },
        "tns-ios": {
            "version": "6.5.3"
        }
    },
    "description": "NativeScript Application",
    "license": "SEE LICENSE IN <your-license-filename>",
    "repository": "<fill-your-repository-here>",
    "dependencies": {
        "@angular/animations": "~8.2.0",
        "@angular/common": "~8.2.0",
        "@angular/compiler": "~8.2.0",
        "@angular/core": "~8.2.0",
        "@angular/forms": "~8.2.0",
        "@angular/platform-browser": "~8.2.0",
        "@angular/platform-browser-dynamic": "~8.2.0",
        "@angular/router": "~8.2.0",
        "@danvick/ngx-translate-nativescript-loader": "^2.0.0",
        "@nativescript/core": "^6.4.1",
        "@nativescript/theme": "^2.5.0",
        "@ngx-translate/core": "^12.1.2",
        "@ngx-translate/http-loader": "^4.0.0",
        "@nstudio/nativescript-loading-indicator": "^3.0.3",
        "@schematics/angular": "^8.3.18",
        "autobind-decorator": "^2.4.0",
        "moment": "^2.24.0",
        "moment-timezone": "^0.5.32",
        "nativescript-angular": "~8.2.0",
        "nativescript-appversion": "^1.4.4",
        "nativescript-camera": "^4.5.0",
        "nativescript-feedback": "^1.3.12",
        "nativescript-geolocation": "^5.1.0",
        "nativescript-google-maps-sdk": "^2.9.1",
        "nativescript-imagepicker": "^7.1.0",
        "nativescript-inappbrowser": "^2.2.0",
        "nativescript-iqkeyboardmanager": "^1.5.1",
        "nativescript-store-update": "^1.0.2",
        "nativescript-ui-chart": "^7.1.1",
        "nativescript-ui-dataform": "^6.0.0",
        "nativescript-ui-sidedrawer": "^8.0.1",
        "nativescript-unit-test-runner": "^0.7.0",
        "nativescript-urlhandler": "^1.3.0",
        "reflect-metadata": "~0.1.12",
        "rxjs": "^6.4.0",
        "tns-android": "^6.5.3",
        "tns-core-modules": "^6.5.24",
        "tns-ios": "^6.5.3",
        "zone.js": "~0.9.1"
    },
    "devDependencies": {
        "@angular/cli": "^9.0.5",
        "@angular/compiler-cli": "~8.2.0",
        "@nativescript/schematics": "^1.0.0",
        "@ngtools/webpack": "~8.2.0",
        "@types/jasmine": "3.5.6",
        "@types/jest": "^24.0.20",
        "@types/mocha": "^5.2.7",
        "jasmine-marbles": "^0.6.0",
        "karma": "4.4.1",
        "karma-jasmine": "3.1.1",
        "karma-nativescript-launcher": "0.4.0",
        "karma-typescript": "^4.1.1",
        "karma-typescript-angular2-transform": "^4.1.1",
        "karma-webpack": "3.0.5",
        "nativescript-dev-webpack": "^1.5.1",
        "node-sass": "^4.12.0",
        "sass": "^1.23.7",
        "sass-loader": "^8.0.0",
        "tns-platform-declarations": "^6.4.1",
        "typescript": "~3.5.3",
        "webpack": "^4.44.1"
    },
    "gitHead": "1964ea9e8ca1a0518e0d6370781eedcf6c23db42",
    "readme": "NativeScript Application"
}

I am using this plugin to select photos from the gallery. When my user's session token expires and they re-login and go back to the photos page, I am getting an error:

Tap on select

JS:   "type": "error",
JS: TypeError: Cannot read property 'startActivityForResult' of undefined
JS:   "error": "Error: Uncaught (in promise): Error: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference\ncreateAlertDialog(file:///data/data/org.nativescript.SelfServiceApp/files/app/vendor.js:105515:17)\n\tat (file:///data/data/org.nativescript.SelfServiceApp/files/app/vendor.js:105599:27)\n\tat ZoneAwarePromise(file:///data/data/org.nativescript.SelfServiceApp/files/app/vendor.js:165937:29)\n\tat alert(file:///data/data/org.nativescript.SelfServiceApp/files/app/vendor.js:105596:12)\n\tat module.exports.push../app/authenticated/home-page/components/photo-clocking-button/modals/photo-clocking-modal/photo-clocking-modal.component.ts.PhotoClockingModalComponent.handleError(file:///data/data/org.nativescript.SelfServiceApp/files/app/bundle.js:3424:9)\n\tat push.../node_modules/nativescript-angular/zone-js/dist/zone-nativescript.js.ZoneDelegate.invoke(file:///data/data/org.nativescrip...
JS: Unhandled Promise rejection: java.lang.IllegalArgumentException: Activity cannot be null! ; Zone: <root> ; Task: null ; Value: Error: java.lang.IllegalArgumentException: Activity cannot be null! (file: node_modules/nativescript-feedback/feedback.android.js:17:0)
JS:     at ZoneAwarePromise(file: node_modules/nativescript-angular/zone-js/dist/zone-nativescript.js:902:0)
JS:     at ZoneAwarePromise(file: node_modules/nativescript-angular/zone-js/dist/zone-nativescript.js:902:0)

Picture component

import { Component, OnInit } from '@angular/core';
import autobind from 'autobind-decorator';
import { ModalDialogParams } from 'nativescript-angular/modal-dialog';
import * as camera from 'nativescript-camera';
import * as imagepicker from 'nativescript-imagepicker';
import { ImageAsset } from 'tns-core-modules/image-asset';
import { ImageSource } from 'tns-core-modules/image-source/';
import { Constants } from '~/app/core/constants/constants.service';
import { IPhotoData } from '../../models/iphoto-data';

@Component({
    selector: 'ns-photo-clocking-modal',
    templateUrl: './photo-clocking-modal.component.html'
})
export class PhotoClockingModalComponent implements OnInit {
    private options: camera.CameraOptions = {
        width: 300,
        height: 300,
        keepAspectRatio: true,
        saveToGallery: true
    };

    public image_data: IPhotoData | string = 'res://avatar';

    constructor(private params: ModalDialogParams) {}

    ngOnInit() {}

    public take(): void {
        const isAvailable: boolean = camera.isAvailable() as boolean;

        if (!isAvailable) {
            this.handleError(Constants.DEFAULT_ERRORS.CAMERA_NOT_AVAILABLE);

            return;
        }

        camera
            .requestPermissions()
            .then(
                () => {
                    camera
                        .takePicture(this.options)
                        .then(this.convertPhotoToBase64)
                        .catch((error) => console.log(error));
                },
                (error) => {
                    // tslint:disable-next-line: no-console
                    console.log(error);
                }
            )
            .catch((error) => console.log(error));
    }

    @autobind
    private convertPhotoToBase64(imageAsset: ImageAsset): Promise<string> {
        return ImageSource.fromAsset(imageAsset).then((image: ImageSource) => {
            const base64: string = image.toBase64String('png');
            this.image_data = { mediaTypeField: 'image/png', imageDataField: base64 };

            return base64;
        });
    }

    @autobind
    private handleError(error): void {
        const options = {
            title: 'Error',
            message: error,
            okButtonText: 'OK'
        };

        //alert(options);
    }

    public select(): void {
        const context = imagepicker.create({
            mode: 'single'
        });

        context
            .authorize()
            .then(() => context.present())
            .then(this.handlePhotoSelectionSuccess)
            .catch(this.handleError);
    }

    @autobind
    private handlePhotoSelectionSuccess(selectedPhotos: ImageAsset[]): Promise<string> {
        if (selectedPhotos == null || selectedPhotos.length === 0) {
            return Promise.reject(Constants.DEFAULT_ERRORS.CAMERA_NOT_AVAILABLE);
        }

        const selectedPhoto: ImageAsset = selectedPhotos[0];
        selectedPhoto.options = { width: this.options.width, height: this.options.height };

        return this.convertPhotoToBase64(selectedPhoto);
    }

    public close(): void {
        this.params.closeCallback(false);
    }

    public clock(): void {
        this.params.closeCallback(this.image_data);
    }
}

What could be wrong?

aubrey-fowler avatar Dec 18 '20 16:12 aubrey-fowler