Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Firebase存储下载+;ContentResolver(API>;=29)_Java_Android_Firebase_Android Contentresolver - Fatal编程技术网

Java 从Firebase存储下载+;ContentResolver(API>;=29)

Java 从Firebase存储下载+;ContentResolver(API>;=29),java,android,firebase,android-contentresolver,Java,Android,Firebase,Android Contentresolver,我正在尝试连接ContentResolver和Firebase存储下载 目标:将文件从Firebase存储下载到图像库或音频文件夹 我所做的: ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DISPLAY_NAME, "FileName1"); values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg"); values.pu

我正在尝试连接ContentResolver和Firebase存储下载

目标:将文件从Firebase存储下载到图像库或音频文件夹

我所做的:

ContentValues  values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, "FileName1");
values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
values.put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures" + customDir);

AsyncQueryHandler asyncQueryHandler1 = new AsyncQueryHandler(myContentResolver){
    @Override
    protected void onInsertComplete(int token, Object cookie, Uri uri) {
        super.onInsertComplete(token, cookie, uri);
        File localFile = new File(uri.getPath());
        StorageReference ref = FirebaseStorage.getInstance().getReference(myFireStorageFilePath());
        ref.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
    ........
}
};
asyncQueryHandler1.startInsert(-1, null, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
我不明白我做错了什么。我可以创建Uri然后创建文件吗


谢谢

最终我无法将API>=29中的Uri和文件粘在一起,但以下是对我有效的方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                values = new ContentValues();
                values.put(MediaStore.MediaColumns.DISPLAY_NAME, af.getFileName());
                values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
                values.put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures" + customDir);
                values.put(MediaStore.MediaColumns.IS_PENDING, 1);
                AsyncQueryHandler asyncQueryHandler1 = new AsyncQueryHandler(cr){
                    @Override
                    protected void onInsertComplete(int token, Object cookie, Uri uri) {
                        super.onInsertComplete(token, cookie, uri);
                        onUriCreated(uri, af, token, fr);
                    }
                };
                asyncQueryHandler1.startInsert(i, null, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            }
职能:

    void onUriCreated(Uri uri, Attachedfile af, int finalI, FileRepo fr) {
            if(uri != null){
                StorageReference ref = FirebaseStorage.getInstance().getReference(myFireStorageFilePath);

                ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {

                    @Override
                    public void onSuccess(Uri downloadUri) {
                        RetrieveAndInsert(downloadUri.toString(), uri, finalI, af, fr);
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        // Handle any errors
                    }
                });
             }
        }
void onuricated(Uri-Uri、Attachedfile-af、int-finalI、FileRepo-fr){
if(uri!=null){
StorageReference ref=FirebaseStorage.getInstance().getReference(myFireStorageFilePath);
ref.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时公共无效(Uri下载Uri){
RetrieveAndInsert(下载uri.toString(),uri,finalI,af,fr);
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//处理任何错误
}
});
}
}
下面是保存文件的位置:

public void RetrieveAndInsert (String downloadUri, Uri localUri) {
    new RetrieveTask(localUri).execute(downloadUri);
}
class RetrieveTask extends AsyncTask<String, Void, Void> {

    String downloadUri;
    Uri localUri;

    RetrieveTask(Uri localUri) {
        this.localUri = localUri;
    }
    @Override
    protected Void doInBackground(final String... downloadUri) {

        this.downloadUri = downloadUri[0];
        InputStream inp = null;
        OutputStream output = null;
        try{
            URL url = new URL(this.downloadUri);
            URLConnection urlCon = url.openConnection();
            HttpURLConnection httpCon = (HttpURLConnection) urlCon;
            httpCon.connect();
            output = cr.openOutputStream(localUri);
            int lengthOfFile = httpCon.getContentLength();
            inp = new BufferedInputStream(url.openStream(), 8192);// httpCon.getInputStream();

            byte[] buffer = new byte[1024];
            int bytesRead;
            long total = 0;
            while ((bytesRead = inp.read(buffer)) != -1) {
                total += bytesRead;
                output.write(buffer, 0, bytesRead);
            }
            downloadedFiles[0]++;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            cr.delete(localUri, null, null);
        } catch (IOException e) {
            e.printStackTrace();
            cr.delete(localUri, null, null);
        } finally{
            try {
                inp.close();
                output.flush();
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e){
                e.printStackTrace();
            }

            ContentValues values = new ContentValues();
            values.put(MediaStore.MediaColumns.IS_PENDING, 0);
            cr.update(localUri, values, null, null);
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        //
    }
}
public void RetrieveAndInsert(字符串下载Uri、Uri本地Uri){
新的RetrieveTask(localUri).execute(downloadUri);
}
类RetrieveTask扩展了异步任务{
字符串下载URI;
urilocaluri;
检索任务(Uri localUri){
this.localUri=localUri;
}
@凌驾
受保护的Void doInBackground(最终字符串…下载URI){
this.downloadUri=downloadUri[0];
InputStream inp=null;
OutputStream输出=null;
试一试{
URL=新URL(this.downloadUri);
URLConnection urlCon=url.openConnection();
HttpURLConnection httpCon=(HttpURLConnection)urlCon;
httpCon.connect();
output=cr.openOutputStream(localUri);
int lengthOfFile=httpCon.getContentLength();
inp=new BufferedInputStream(url.openStream(),8192);//httpCon.getInputStream();
字节[]缓冲区=新字节[1024];
int字节读取;
长总计=0;
而((bytesRead=inp.read(buffer))!=-1){
总计+=字节读取;
输出写入(缓冲区,0,字节读取);
}
下载的文件[0]++;
}捕获(格式错误){
e、 printStackTrace();
cr.delete(localUri,null,null);
}捕获(IOE异常){
e、 printStackTrace();
cr.delete(localUri,null,null);
}最后{
试一试{
inp.close();
output.flush();
output.close();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace();
}
ContentValues=新的ContentValues();
value.put(MediaStore.MediaColumns.IS_PENDING,0);
cr.update(localUri,value,null,null);
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//
}
}

最终我无法将API>=29中的Uri和文件粘在一起,但以下是对我有效的方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                values = new ContentValues();
                values.put(MediaStore.MediaColumns.DISPLAY_NAME, af.getFileName());
                values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
                values.put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures" + customDir);
                values.put(MediaStore.MediaColumns.IS_PENDING, 1);
                AsyncQueryHandler asyncQueryHandler1 = new AsyncQueryHandler(cr){
                    @Override
                    protected void onInsertComplete(int token, Object cookie, Uri uri) {
                        super.onInsertComplete(token, cookie, uri);
                        onUriCreated(uri, af, token, fr);
                    }
                };
                asyncQueryHandler1.startInsert(i, null, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            }
职能:

    void onUriCreated(Uri uri, Attachedfile af, int finalI, FileRepo fr) {
            if(uri != null){
                StorageReference ref = FirebaseStorage.getInstance().getReference(myFireStorageFilePath);

                ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {

                    @Override
                    public void onSuccess(Uri downloadUri) {
                        RetrieveAndInsert(downloadUri.toString(), uri, finalI, af, fr);
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        // Handle any errors
                    }
                });
             }
        }
void onuricated(Uri-Uri、Attachedfile-af、int-finalI、FileRepo-fr){
if(uri!=null){
StorageReference ref=FirebaseStorage.getInstance().getReference(myFireStorageFilePath);
ref.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时公共无效(Uri下载Uri){
RetrieveAndInsert(下载uri.toString(),uri,finalI,af,fr);
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//处理任何错误
}
});
}
}
下面是保存文件的位置:

public void RetrieveAndInsert (String downloadUri, Uri localUri) {
    new RetrieveTask(localUri).execute(downloadUri);
}
class RetrieveTask extends AsyncTask<String, Void, Void> {

    String downloadUri;
    Uri localUri;

    RetrieveTask(Uri localUri) {
        this.localUri = localUri;
    }
    @Override
    protected Void doInBackground(final String... downloadUri) {

        this.downloadUri = downloadUri[0];
        InputStream inp = null;
        OutputStream output = null;
        try{
            URL url = new URL(this.downloadUri);
            URLConnection urlCon = url.openConnection();
            HttpURLConnection httpCon = (HttpURLConnection) urlCon;
            httpCon.connect();
            output = cr.openOutputStream(localUri);
            int lengthOfFile = httpCon.getContentLength();
            inp = new BufferedInputStream(url.openStream(), 8192);// httpCon.getInputStream();

            byte[] buffer = new byte[1024];
            int bytesRead;
            long total = 0;
            while ((bytesRead = inp.read(buffer)) != -1) {
                total += bytesRead;
                output.write(buffer, 0, bytesRead);
            }
            downloadedFiles[0]++;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            cr.delete(localUri, null, null);
        } catch (IOException e) {
            e.printStackTrace();
            cr.delete(localUri, null, null);
        } finally{
            try {
                inp.close();
                output.flush();
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e){
                e.printStackTrace();
            }

            ContentValues values = new ContentValues();
            values.put(MediaStore.MediaColumns.IS_PENDING, 0);
            cr.update(localUri, values, null, null);
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        //
    }
}
public void RetrieveAndInsert(字符串下载Uri、Uri本地Uri){
新的RetrieveTask(localUri).execute(downloadUri);
}
类RetrieveTask扩展了异步任务{
字符串下载URI;
urilocaluri;
检索任务(Uri localUri){
this.localUri=localUri;
}
@凌驾
受保护的Void doInBackground(最终字符串…下载URI){
this.downloadUri=downloadUri[0];
InputStream inp=null;
OutputStream输出=null;
试一试{
URL=新URL(this.downloadUri);
URLConnection urlCon=url.openConnection();
HttpURLConnection httpCon=(HttpURLConnection)urlCon;
httpCon.connect();
output=cr.openOutputStream(localUri);
int lengthOfFile=httpCon.getContentLength();
inp=new BufferedInputStream(url.openStream(),8192);//httpCon.getInputStream();
字节[]缓冲区=新字节[1024];
int字节读取;
长总计=0;
而((bytesRead=inp.read(buffer))!=-1){
总计+=字节读取;
输出写入(缓冲区,0,字节读取);
}
下载的文件[0]++;
}捕获(格式错误){
e、 printStackTrace();
cr.delete(localUri,null,null);
}捕获(IOE异常){
e、 printStackTrace();
cr.delete(localUri,null,null);
}最后{
试一试{
inp.close();
output.flush();
output.close();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace()