سؤال

توفر واجهات برمجة تطبيقات مزود المحتوى/ المحتوى طريقة معقدة ، ولكنها قوية لنقل البيانات بين العمليات باستخدام URI و openInputStream() و openOutputStream() أساليب. يتمتع مزودو المحتوى المخصصون بالقدرة على تجاوز openFile() الطريقة مع رمز مخصص لحل URI بشكل فعال في Stream; ؛ ومع ذلك ، فإن توقيع طريقة openFile() لديه ParcelFileDescriptor نوع الإرجاع وليس من الواضح كيف يمكن للمرء أن يولد تمثيلًا مناسبًا للمحتوى الذي تم إنشاؤه ديناميكيًا للعودة من هذه الطريقة.

إرجاع ذاكرة تم تعيين InputStream من مزود المحتوى؟

هل هناك أمثلة على التنفيذ ContentProvider.openFile() طريقة للمحتوى الديناميكي في قاعدة التعليمات البرمجية الحالية؟ إذا لم يكن بإمكانك اقتراح رمز المصدر أو العملية للقيام بذلك؟

هل كانت مفيدة؟

المحلول

تدعم MemoryFile هذا ، ولكن لم يتم الانتهاء من واجهة برمجة التطبيقات العامة.

نصائح أخرى

تحقق من هذا المشروع المثال الرائع من برنامج المشاع المفيد دائمًا. يتيح لك إنشاء أنبوب parcelfiledescriptor مع أي إدخال تريده على جانب واحد ، وتطبيق الاستلام على الجانب الآخر:

https://github.com/commonsguy/cw-omnibus/tree/master/contentprovider/pipe

الأجزاء الرئيسية هي إنشاء الأنبوب في openFile:

public ParcelFileDescriptor openFile(Uri uri, String mode)
                                                        throws FileNotFoundException {
    ParcelFileDescriptor[] pipe=null;

    try {
      pipe=ParcelFileDescriptor.createPipe();
      AssetManager assets=getContext().getResources().getAssets();

      new TransferThread(assets.open(uri.getLastPathSegment()),
                       new AutoCloseOutputStream(pipe[1])).start();
    }
    catch (IOException e) {
      Log.e(getClass().getSimpleName(), "Exception opening pipe", e);
      throw new FileNotFoundException("Could not open pipe for: "
          + uri.toString());
    }

    return(pipe[0]);
  }

ثم قم بإنشاء خيط يحافظ على الأنبوب ممتلئًا:

static class TransferThread extends Thread {
    InputStream in;
    OutputStream out;

    TransferThread(InputStream in, OutputStream out) {
        this.in = in;
        this.out = out;
    }

    @Override
    public void run() {
        byte[] buf = new byte[8192];
        int len;

        try {
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }

            in.close();
            out.flush();
            out.close();
        } catch (IOException e) {
            Log.e(getClass().getSimpleName(),
                    "Exception transferring file", e);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top