Приложение работает на эмуляторе, а не на физическом устройстве: я не могу получить доступ к изображениям, которые я определил как URL на Firebase - PullRequest
0 голосов
/ 26 мая 2018

Мое приложение нормально работает на эмуляторе, но когда я устанавливаю его на физический телефон, я не могу получить доступ к изображениям, которые я определил как URL в Firebase.Поэтому, когда я загружаю приложение на телефон, картинок нет.Кроме того, на практике все работает отлично.Можете ли вы порекомендовать мне что-нибудь сделать?Версия телефона Android: Android 7 API 24.

это эмулятор

введите описание изображения здесь

это мой телефон

введите описание изображения здесь

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();
    }
}

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Я решил эту проблему.Поскольку я не собираюсь менять изображения, которые хочу видеть, я настроил переменные классов моделей.Я изменился следующим образом:

с

private String Image;

на

public String Image;

Я использовал методы получения и установки для просмотра изображений.После этого я изменил методы адаптера FoodList следующим образом:

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

Как вы можете видеть, я также обновил Picasso.Я использовал последнюю версию.Используется get() вместо with().Для этого не нужно getBaseContext().

Как я уже говорил, я не собираюсь менять изображения.Поэтому я могу использовать model.Image Если ваши изображения изменчивы, вам нужно использовать методы получения и установки, как вы знаете.

0 голосов
/ 26 мая 2018

В вашем телефоне следуйте этим шагам, перейдите в настройки, затем приложения / установленное приложение .... и найдите ваше приложение, затем нажмите "Открыть" и в опции "Разрешение приложения" разрешите все разрешения
Надеюсь, что его работы

...