安卓 - 应用程序在调用CAPTURE_IMAGE意图并拍照后进入启动器(不返回片段)

时间:2017-11-02 17:53:33

标签: java android android-fragments android-intent camera

所以我有一个Fragment调用以下启动摄像头的方法:

private void launchCamera() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

我期望在我的片段中收到此方法中的图片数据:

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (!(resultCode == RESULT_OK)) return;

        if (requestCode == REQUEST_IMAGE_CAPTURE || requestCode == REQUEST_GALLERY_IMAGE) {
            Uri imageURI = data.getData();

// do something
    }
}

然而,在我拍照并确认之后,该应用程序将转到我的启动器。在onActivityResult方法中设置断点后,应用程序甚至在崩溃之前甚至都没有达到此方法。我已经授权确保在清单和运行时都授予所有权限。

在应用程序日志和设备日志中,此崩溃的Logcat也没有输出。我也在我的设备(Moto G5 Plus)上进行了测试。 Pixel XL API 26仿真器;两者都有相同的结果。

4 个答案:

答案 0 :(得分:0)

我认为您需要致电super.onActivityResult()。 该片段是进行startActivityForResult()调用的片段,但是活动获得了处理结果的第一步,因此您需要实现super.onActivityResult()以使片段处理结果。

答案 1 :(得分:0)

  

应用程序立即崩溃到我的启动器

不,相机应用程序立即启动发射器。显然,这个相机应用程序的开发人员写了它,以便在用户完成拍照后调出主屏幕。当然,这是一个错误,但你无能为力。

当你喜欢图片时使用mylist = [a, b, c, d] counter = {a:mylist.count(a) for a in mylist} if 1 in counter.values() and len(counter) == 2: print("three are the same") ,但是如果你没有得到它,请不要介意,因为你正在集成的数百个相机应用程序中的一些错误。否则,请使用相机库(Fotoapparat,CameraKit-Android等)直接在您自己的应用中拍摄照片。

此外,FWIW,ACTION_IMAGE_CAPTURE未返回ACTION_IMAGE_CAPTURE,因此您的Uri代码无论如何都无效。根据您的onActivityResult() ACTION_IMAGE_CAPTURE个特定配置,在Intent中,onActivityResult()将返回代表缩略图大小图片的data.getParcelableExtra("data")

答案 2 :(得分:0)

我相信这是 Android: Activity getting Destroyed after calling Camera Intent 的另一种表现形式。

最重要的是,系统会从头开始重新启动您的应用,并且您的活动已创建,但有可能恢复其状态。

所以你必须实现onRestoreInstanceState()。我不确定你能否保证片段能够及时接收onActiviyResult(),所以为了安全起见,我更喜欢在活动中处理捕获的图像。

答案 3 :(得分:0)

所以这个问题实际上是因为我附加了活动的意图标志。我的活动是使用import { Injectable, Inject, Injector } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Http, URLSearchParams } from '@angular/http'; import { APP_BASE_HREF } from '@angular/common'; import { ORIGIN_URL } from '@nguniversal/aspnetcore-engine'; import { Observable } from 'rxjs/Observable'; import { LogEntry } from './../models/Logging/LogEntry'; @Injectable() export class LoggingHttpService { private baseUrl: string; constructor(private http: Http, private injector: Injector) { this.baseUrl = this.injector.get(ORIGIN_URL); } private static readonly LOG_INFORMATION_URL: string = '/api/logging/loginformation'; private static readonly LOG_DEBUG_URL: string = '/api/logging/logdebug'; private static readonly LOG_WARNING_URL: string = '/api/logging/logwarning'; private static readonly LOG_ERROR_URL: string = '/api/logging/logerror'; logInformation(logEntry: LogEntry) { return this.http.post(this.baseUrl + LoggingHttpService.LOG_INFORMATION_URL, logEntry); } logDebug(logEntry: LogEntry) { return this.http.post(this.baseUrl + LoggingHttpService.LOG_DEBUG_URL, logEntry); } logWarning(logEntry: LogEntry) { return this.http.post(this.baseUrl + LoggingHttpService.LOG_WARNING_URL, logEntry); } logError(logEntry: LogEntry) { return this.http.post(this.baseUrl + LoggingHttpService.LOG_ERROR_URL, logEntry); } } 意图标记启动的,这显然阻止了从NO_HISTORY调用返回时重新创建它。