应用程序适用于模拟器而不是物理设备:我无法访问我在 Firebase 上定义为 URL 的图像

Application works on emulator not on physical device: I can not access the images I defined as URL on Firebase

我的应用程序在模拟器上正常运行,但是当我将它安装在物理 phone 上时,我无法访问我在 Firebase 中定义为 URL 的图像。所以当我上传应用到phone时,没有图片。除此之外,在实践中一切正常。有什么可以推荐我做的吗? Android 版本 phone:Android 7 API 24.

这是模拟器

enter image description here

这是我的phone

enter image description here

package com.orderfood.teknomerkez.orderfood;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.mancj.materialsearchbar.MaterialSearchBar;
import com.orderfood.teknomerkez.orderfood.Interface.ItemClickListener;
import com.orderfood.teknomerkez.orderfood.Model.Food;
import com.orderfood.teknomerkez.orderfood.ViewHolder.FoodViewHolder;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;

public class FoodList extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    FirebaseDatabase database;
    DatabaseReference foodList;
    private final String REFERENCE = "Food";
    private String FoodId = "FoodId";
    String categoryID = "";
    FirebaseRecyclerAdapter<Food, FoodViewHolder> adapter;
    FirebaseRecyclerAdapter<Food, FoodViewHolder> searchAdapter;
    List<String> suggestList = new ArrayList<>();
    MaterialSearchBar materialSearchBar;
    private String getCategoryId = "CategoryId";



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_food_list);
        //Firebase
        database = FirebaseDatabase.getInstance();
        foodList = database.getReference(REFERENCE);

        recyclerView = findViewById(R.id.recycler_food);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        //get intent
        if (getIntent() != null)
            categoryID = getIntent().getStringExtra(getCategoryId);
        if (!categoryID.isEmpty() && categoryID != null) {
            loadListFood(categoryID);
        }

        //material Search
        materialSearch();
    }

    private void materialSearch() {
        materialSearchBar = findViewById(R.id.searchBar);
        materialSearchBar.setHint("Enter Your Food");
        loadSuggest();
        materialSearchBar.setLastSuggestions(suggestList);
        materialSearchBar.setCardViewElevation(10);
        materialSearchBar.addTextChangeListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                //when user type something, we will change suggestlist
                List<String> suggest = new ArrayList<>();
                for (String search : suggest) { // loop in suggest list
                    if (search.toLowerCase().contains(materialSearchBar.getText().toLowerCase())) {
                        suggest.add(search);
                    }
                    materialSearchBar.setLastSuggestions(suggest);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
        materialSearchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {
            @Override
            public void onSearchStateChanged(boolean enabled) {
                //when search bar is close - restore original adapter
                if (!enabled)
                    recyclerView.setAdapter(adapter);
            }

            @Override
            public void onSearchConfirmed(CharSequence text) {
                //when searhc finish
                startSearch(text);
            }

            @Override
            public void onButtonClicked(int buttonCode) {

            }
        });
    }

    private void loadSuggest() {
        foodList.orderByChild("MenuId").equalTo(categoryID).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot postSnapShot : dataSnapshot.getChildren()){
                    Food item = postSnapShot.getValue(Food.class);
                    suggestList.add(item.getName());
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    private void startSearch(CharSequence text) {
        Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("Food")
                .startAt(text.toString())
                .limitToLast(50);

        FirebaseRecyclerOptions<Food> options = new FirebaseRecyclerOptions.Builder<Food>().setQuery(query, Food.class).build();
        searchAdapter = new FirebaseRecyclerAdapter<Food, FoodViewHolder>(options)
        {
            @NonNull
            @Override
            public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.food_item, parent,false);
                return new FoodViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull FoodViewHolder viewHolder, int position, @NonNull Food model) {
                viewHolder.food_name.setText(model.getName());
                Picasso.with(getBaseContext()).load(model.getImage())
                        .into(viewHolder.food_image);
                final Food local = model;
                viewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(View view, int position, boolean isLongClick) {
                        Toast.makeText(FoodList.this, "" + local.getName(), Toast.LENGTH_SHORT).show();
                        //go food
                        Intent foodDetail = new Intent(FoodList.this, FoodDetail.class);
                        foodDetail.putExtra(FoodId, searchAdapter.getRef(position).getKey());
                        startActivity(foodDetail);
                    }
                });
            }
        };
        recyclerView.setAdapter(searchAdapter); //set adapter for recycler view  is search result
    }


    private void loadListFood(String categoryID) {
        Query query = FirebaseDatabase.getInstance()
                .getReference()
                .child("Food")
                .child(categoryID);

        FirebaseRecyclerOptions<Food> options = new FirebaseRecyclerOptions.Builder<Food>().setQuery(query,Food.class).build();
        adapter = new FirebaseRecyclerAdapter<Food, FoodViewHolder>(options) {
            @NonNull
            @Override
            public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.food_item, parent,false);
                return new FoodViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull FoodViewHolder viewHolder, int position, @NonNull Food model) {
                viewHolder.food_name.setText(model.getName());
                Log.d("TAG", model.getName());
                Picasso.with(getBaseContext()).load(model.getImage())
                        .into(viewHolder.food_image);
                final Food local = model;
                viewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(View view, int position, boolean isLongClick) {
                        Toast.makeText(FoodList.this, "" + local.getName(), Toast.LENGTH_SHORT).show();
                        //go food
                        Intent foodDetail = new Intent(FoodList.this, FoodDetail.class);
                        //foodDetail.putExtra("FoodId", adapter.getItem(position).getFoodId());
                        foodDetail.putExtra("FoodId", String.valueOf(position));
                        foodDetail.putExtra("CategoryID", adapter.getItem(position).getMenuId());
                        foodDetail.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(foodDetail);
                    }
                });
            }
        };
        Log.d("TAG", "" + adapter.getItemCount());
        recyclerView.setAdapter(adapter);
    }

    @Override
    protected void onStart(){
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop(){
        super.onStop();
        adapter.stopListening();
    }
}

在你的phone 按照这个步骤 前往设置 然后 apps/installed 应用....并搜索您的应用 然后点击打开 并在 App Permission 选项中允许所有权限
希望它的作品

我已经解决了这个问题。因为我不打算更改我想看到的图像,所以我自定义了模型 类 变量。我变成了这样;

来自

private String Image;

public String Image;

我使用 getter 和 setter 方法查看图像。之后我像这样更改了 FoodList 适配器方法;

Picasso p = Picasso.get();
 p.load(model.Image).into(viewHolder.food_image);

如您所见,我也更新了 Picasso。我用的是最新版本。它被用来 get() 而不是 with()。它不需要 getBaseContext().

正如我告诉过你的,我不会更改图像。所以我可以使用 model.Image 如果你的图像是可变的,你需要使用 getter 和 setter 方法,如你所知。