代码之家  ›  专栏  ›  技术社区  ›  Ksenia

android.system.ErrnoException:ioctl失败:EBADF(错误的文件描述符)包含来自数据/数据文件夹的文件

  •  0
  • Ksenia  · 技术社区  · 6 年前

    我将同一个应用程序从Android Studio安装到不同的设备上,它已成功安装在所有设备上,但在启动后,当我在某些设备上使用此应用程序内部存储中的文件时,会出现以下错误:

    E/java: [FileUploader] java.io.IOException: ioctl failed: EBADF (Bad file descriptor)
            at libcore.io.IoBridge.available(IoBridge.java:74)
            at java.io.FileInputStream.available(FileInputStream.java:108)
            at packagename.FileUploader$1.contentLength(FileUploader.java:530)
            at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:67)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
            at com.android.tools.profiler.agent.okhttp.OkHttp3Interceptor.intercept(OkHttp3Interceptor.java:57)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
            at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
            at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
            at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
            at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
            at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
            at okhttp3.RealCall.execute(RealCall.java:77)
            at packagename.performFileUploadRequest(FileUploader.java:483)
            at packagename.FileUploader.performUploadRequestByType(FileUploader.java:429)
            at com
    
    
    11-16 11:45:03.138 20253-21432/packagename E/java: .packagename.FileUploader.tryUploadFileToServer(FileUploader.java:393)
            at packagename.FileUploader.lambda$uploadFileToServer$2(FileUploader.java:302)
            at packagename.-$$Lambda$FileUploader$MZ_TG9wHD8CqIUeh0jeiS8COakc.call(lambda)
            at rx.Observable.unsafeSubscribe(Observable.java:10256)
            at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:248)
            at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:148)
            at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77)
            at rx.observers.Subscribers$5.onNext(Subscribers.java:235)
            at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:276)
            at rx.Subscriber.setProducer(Subscriber.java:211)
            at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
            at rx.Subscriber.setProducer(Subscriber.java:205)
            at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:138)
            at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:129)
            at rx.Observable.unsafeSubscribe(Observable.java:10256)
            at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
            at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
            at rx.Observable.unsafeSubscribe(Observable.java:10256)
            at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
            at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
            at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
            at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
            at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
            at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
            at rx.Observable.unsafeSubscribe(Observable.java:10256)
            at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.
    
    11-16 11:45:03.138 20253-21432/packagename E/java: java:41)
            at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
            at rx.Observable.unsafeSubscribe(Observable.java:10256)
            at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
            at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
            at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
            at java.lang.Thread.run(Thread.java:818)
         Caused by: android.system.ErrnoException: ioctl failed: EBADF (Bad file descriptor)
            at libcore.io.Posix.ioctlInt(Native Method)
            at libcore.io.ForwardingOs.ioctlInt(ForwardingOs.java:103)
            at libcore.io.IoBridge.available(IoBridge.java:58)
                ... 60 more
    

    data/data/packagename/files 文件夹。异常点所在的代码如下所示(与 fileStream.available() ):

    RequestBody requestBody = new RequestBody() {
                @Override
                public MediaType contentType() {
                    return MediaType.parse(file.getMimeType());
                }
    
                @Override
                public long contentLength() throws IOException {
                    return fileStream.available();
                }
    
                @Override
                public void writeTo(BufferedSink sink) throws IOException {
                    Source source = null;
                    try {
                        source = Okio.source(fileStream);
                        sink.writeAll(source);
                    } finally {
                        Util.closeQuietly(source);
                    }
                }
            };
    

    哪里 RequestBody 是来自okhttp3库的抽象类。这个错误的原因是什么?

    附笔。

    当我在Android Studio中使用终端和 gradlew 任务,而不是 按钮,此应用程序工作时不会出现此错误。所以,这似乎是我的Android Studio的一部分,但我甚至无法想象到底是什么,这让我震惊。。。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ksenia    6 年前

    难以置信,但原因是中的启用复选框 运行/调试配置 : " 启用高级评测(API级别<(仅限第26页)