Java 将相机图像保存到SD卡,检索并上载到Firestore存储

Java 将相机图像保存到SD卡,检索并上载到Firestore存储,java,android,firebase,kotlin,google-cloud-firestore,Java,Android,Firebase,Kotlin,Google Cloud Firestore,我在SD卡中保存图像时遇到困难。由于某种原因,它会保存到内部存储文件夹中。 我也无法检索存储图像的文件路径。或者我没有正确地检索文件。因此,我无法将图像上载到Firestore存储 我已经包括了我的所有代码,如果有人可以帮助它将不胜感激。目前正在使用三星Galaxy S10。这是为了支持我的Firestore应用程序的脱机功能 我保存的图像仅存储在中 Internal Storage / Android / data / com.mly.Live /files / Pictures / 我想把

我在SD卡中保存图像时遇到困难。由于某种原因,它会保存到内部存储文件夹中。 我也无法检索存储图像的文件路径。或者我没有正确地检索文件。因此,我无法将图像上载到Firestore存储

我已经包括了我的所有代码,如果有人可以帮助它将不胜感激。目前正在使用三星Galaxy S10。这是为了支持我的Firestore应用程序的脱机功能

我保存的图像仅存储在中

Internal Storage / Android / data / com.mly.Live /files / Pictures /
我想把它保存在SD卡文件夹里

安卓清单

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.mly.Live.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
当我保存Firestore文档时。。。我将“imageRemoteSent”设置为false(意味着该图像尚未保存到Firestore存储),并且imageLocal的文件路径

photoURI.toString()给了我

content://com.mly.Live.fileprovider/my_root_images/Pictures/54b4beb1-e30e-4f64-8bd9-9ed37695b474_7839622760179284029.jpg
当前光路给了我。。。(我已经匹配了imageName以说明差异)

我只能在“InternalStorage/Android/data/com.mly.Live/files/Pictures/”中看到这些照片

附加活性(Kotlin)

家庭活动(Java) 实时Firestore侦听器。。。侦听问题为“imageRemoteSent==false”,并尝试将其上载到Firestore存储。当用户在onCreate中登录应用程序时,将调用此函数。我无法正确地将此上载到firestore。 成功上载到Firestore存储后,我更改“imageRemoteSent==true”,并将下载的URL保存在“imageRemote”中

void checkForRemoteImages() {

    FirebaseHelper.getInstance().getIssueLocalImageCollection((issues -> {

        this.issue = issues;

        if (issue.size() > 0) {

            for (Issue object: issue) {

                String imageName = UUID.randomUUID().toString();

                FirebaseStorage storage = FirebaseStorage.getInstance();
                StorageReference storageRef = storage.getReference();

                StorageReference imageReference = storageRef.child("partInfoImagesFolder").child(imageName);

                Uri uriP = Uri.parse(object.getImageLocal());

                Uri uploadUri = Uri.fromFile(new File(uriP.toString()));

                imageReference.putFile(uploadUri)
                        .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {

                                imageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                    @Override
                                    public void onSuccess(Uri uri) {

                                        Uri url = uri;

                                        Toast.makeText(HomeActivity.this, "Upload Successful!", Toast.LENGTH_SHORT).show();

                                        DocumentReference washingtonRef = FirebaseFirestore.getInstance().collection("Issues").document(object.getDocumentId());

                                        washingtonRef
                                                .update("imageRemoteSent", true,
                                                        "imageRemote", url)
                                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                    @Override
                                                    public void onSuccess(Void aVoid) {
                                                        Log.d("TAG WORK!!", "DocumentSnapshot successfully updated!");
                                                    }
                                                })
                                                .addOnFailureListener(new OnFailureListener() {
                                                    @Override
                                                    public void onFailure(@NonNull Exception e) {
                                                        Log.w("TAG FAIL", "Error updating document", e);
                                                    }
                                                });
                                    }
                                });
                            }

                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.w("TAG FAIL", "Error updating document", e);
                            }
                        });

                }

            } else {
                Toast.makeText(HomeActivity.this, "There are no Images to upload to firestore!", Toast.LENGTH_SHORT).show();
            }
    }));
}
void checkForRemoteImages(){
FirebaseHelper.getInstance().getIssueLocalImageCollection((问题->{
这个问题=问题;
如果(issue.size()>0){
对于(问题对象:问题){
字符串imageName=UUID.randomUUID().toString();
FirebaseStorage=FirebaseStorage.getInstance();
StorageReference-storageRef=storage.getReference();
StorageReference imageReference=storageRef.child(“PartInfo ImagesFolder”).child(imageName);
Uri uriP=Uri.parse(object.getImageLocal());
uriuploaduri=Uri.fromFile(新文件(uriP.toString());
imageReference.putFile(上传URI)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
imageReference.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
uriurl=Uri;
Toast.makeText(HomeActivity.this,“上载成功!”,Toast.LENGTH_SHORT.show();
DocumentReference washingtonRef=FirebaseFirestore.getInstance().collection(“Issues”).document(object.getDocumentId());
华盛顿参考
.update(“imageRemoteSent”),true,
“imageRemote”,url)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
Log.d(“标记工作!!”,“DocumentSnapshot已成功更新!”);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(“标记失败”,“错误更新文档”,e);
}
});
}
});
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(“标记失败”,“错误更新文档”,e);
}
});
}
}否则{
Toast.makeText(HomeActivity.this,“没有要上传到firestore的图像!”,Toast.LENGTH\u SHORT.show();
}
}));
}
FirebaseHelper活动(Java)

public void getIssueLocalImageCollection(FireStoreDataRetrieved操作){
FirebaseFirestore.getInstance().collection(ISSUES\u REF).whereEqualTo(“imageRemoteSent”,false)
//.whereEqualTo(“发行性”,真实)
.orderBy(“issueDate”,Query.Direction.DESCENDING)
.addSnapshotListener((快照,错误)->{
List=snapshot.getDocuments();
List infos=new ArrayList();
如果(snapshot.size()>0){
infos=snapshot.toObjects(Issue.class);
}
对于(int index=0;index

如果有人能帮忙,我将不胜感激。我们已经看了一周了。

最好创建一个对话框,让用户选择照片的存放位置。请记住,android设备有很多,它们可能会有所不同。如果你还想这么做,我在这里找到了同样的问题

FilePro
content://com.mly.Live.fileprovider/my_root_images/Pictures/54b4beb1-e30e-4f64-8bd9-9ed37695b474_7839622760179284029.jpg
/storage/emulated/0/Android/data/com.mly.Live/files/Pictures/54b4beb1-e30e-4f64-8bd9-9ed37695b474_7839622760179284029.jpg
private fun saveIssue1() {

    val db = FirebaseFirestore.getInstance()

    val data = hashMapOf(
            "type" to binding?.issueTypeSpinner?.selectedItem.toString(),
            "imageRemoteSent" to false,
            "imageLocal" to photoURI.toString(),
            "imageRemote" to "",
    )

    db.collection("Issues")
            .add(data)
            .addOnSuccessListener { documentReference ->

            }
            .addOnFailureListener { e ->

            }

}
void checkForRemoteImages() {

    FirebaseHelper.getInstance().getIssueLocalImageCollection((issues -> {

        this.issue = issues;

        if (issue.size() > 0) {

            for (Issue object: issue) {

                String imageName = UUID.randomUUID().toString();

                FirebaseStorage storage = FirebaseStorage.getInstance();
                StorageReference storageRef = storage.getReference();

                StorageReference imageReference = storageRef.child("partInfoImagesFolder").child(imageName);

                Uri uriP = Uri.parse(object.getImageLocal());

                Uri uploadUri = Uri.fromFile(new File(uriP.toString()));

                imageReference.putFile(uploadUri)
                        .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {

                                imageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                    @Override
                                    public void onSuccess(Uri uri) {

                                        Uri url = uri;

                                        Toast.makeText(HomeActivity.this, "Upload Successful!", Toast.LENGTH_SHORT).show();

                                        DocumentReference washingtonRef = FirebaseFirestore.getInstance().collection("Issues").document(object.getDocumentId());

                                        washingtonRef
                                                .update("imageRemoteSent", true,
                                                        "imageRemote", url)
                                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                    @Override
                                                    public void onSuccess(Void aVoid) {
                                                        Log.d("TAG WORK!!", "DocumentSnapshot successfully updated!");
                                                    }
                                                })
                                                .addOnFailureListener(new OnFailureListener() {
                                                    @Override
                                                    public void onFailure(@NonNull Exception e) {
                                                        Log.w("TAG FAIL", "Error updating document", e);
                                                    }
                                                });
                                    }
                                });
                            }

                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.w("TAG FAIL", "Error updating document", e);
                            }
                        });

                }

            } else {
                Toast.makeText(HomeActivity.this, "There are no Images to upload to firestore!", Toast.LENGTH_SHORT).show();
            }
    }));
}
public void getIssueLocalImageCollection(FireStoreDataRetrieved<List<Issue>> action){
    FirebaseFirestore.getInstance().collection(ISSUES_REF).whereEqualTo("imageRemoteSent",false)
            //.whereEqualTo("issueActive", true)
            .orderBy("issueDate", Query.Direction.DESCENDING)
            .addSnapshotListener((snapshot, err)->{
                List<DocumentSnapshot> list =  snapshot.getDocuments();

                List<Issue> infos = new ArrayList<>();
                if(snapshot.size() > 0){
                    infos = snapshot.toObjects(Issue.class);
                }

                for (int index = 0 ;index < snapshot.size();index++)
                {
                    infos.get(index).setDocumentId(list.get(index).getId());
                }

                action.onFetch(infos);
            });
}