我的Firebase设备上的索引无效

时间:2017-09-26 11:39:18

标签: android firebase firebase-app-indexing

我正在关注FriendlyChat应用的firebase上的Codelab教程。我已经到了索引部分了。我已经根据需要实现了代码,但是当我在模拟器上搜索谷歌时,我看不到应用程序索引工作。

这是清单部分。

<intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data
                android:host="friendlychat.firebase.google.com"
                android:scheme="http"
                android:pathPrefix="/message"/>
        </intent-filter>

这是MainActivity.java

本教程位于此页面https://codelabs.developers.google.com/codelabs/firebase-android/#8

问题是我正在使用模拟器吗?

这是MainActivity.java

public class MainActivity extends AppCompatActivity
    implements GoogleApiClient.OnConnectionFailedListener {

public static class MessageViewHolder extends RecyclerView.ViewHolder {
    TextView messageTextView;
    ImageView messageImageView;
    TextView messengerTextView;
    CircleImageView messengerImageView;

    public MessageViewHolder(View v) {
        super(v);
        messageTextView = (TextView) itemView.findViewById(R.id.messageTextView);
        messageImageView = (ImageView) itemView.findViewById(R.id.messageImageView);
        messengerTextView = (TextView) itemView.findViewById(R.id.messengerTextView);
        messengerImageView = (CircleImageView) itemView.findViewById(R.id.messengerImageView);
    }
}

private static final String TAG = "MainActivity";
public static final String MESSAGES_CHILD = "messages";
private static final int REQUEST_INVITE = 1;
private static final int REQUEST_IMAGE = 2;
private static final String LOADING_IMAGE_URL = "https://www.google.com/images/spin-32.gif";
public static final int DEFAULT_MSG_LENGTH_LIMIT = 10;
public static final String ANONYMOUS = "anonymous";
private static final String MESSAGE_SENT_EVENT = "message_sent";
private String mUsername;
private String mPhotoUrl;
private SharedPreferences mSharedPreferences;
private GoogleApiClient mGoogleApiClient;
private static final String MESSAGE_URL = "http://friendlychat.firebase.google.com/message/";

private Button mSendButton;
private RecyclerView mMessageRecyclerView;
private LinearLayoutManager mLinearLayoutManager;
private ProgressBar mProgressBar;
private EditText mMessageEditText;
private ImageView mAddMessageImageView;

// Firebase instance variables
private FirebaseAuth mFirebaseAuth;
private FirebaseUser mFirebaseUser;
private DatabaseReference mFirebaseDatabaseReference;
private FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder> mFirebaseAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    // Set default username is anonymous.
    mUsername = ANONYMOUS;

    // Initialize Firebase Auth
    mFirebaseAuth = FirebaseAuth.getInstance();
    mFirebaseUser = mFirebaseAuth.getCurrentUser();
    if(mFirebaseUser == null){
        // Not signed in, launch the Sign in activity
        startActivity(new Intent(this, SignInActivity.class));
        finish();
        return;
    } else {
        mUsername = mFirebaseUser.getDisplayName();
        if(mFirebaseUser.getPhotoUrl() != null){
            mPhotoUrl = mFirebaseUser.getPhotoUrl().toString();
        }
    }

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API)
            .build();

    // Initialize ProgressBar and RecyclerView.
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
    mMessageRecyclerView = (RecyclerView) findViewById(R.id.messageRecyclerView);
    mLinearLayoutManager = new LinearLayoutManager(this);
    mLinearLayoutManager.setStackFromEnd(true);
    mMessageRecyclerView.setLayoutManager(mLinearLayoutManager);

    // New child entries
    mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
    mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder>(
            FriendlyMessage.class,
            R.layout.item_message,
            MessageViewHolder.class,
            mFirebaseDatabaseReference.child(MESSAGES_CHILD)) {

        @Override
        protected FriendlyMessage parseSnapshot(DataSnapshot snapshot){
            FriendlyMessage friendlyMessage = super.parseSnapshot(snapshot);
            if(friendlyMessage != null){
                friendlyMessage.setId(snapshot.getKey());
            }
            return friendlyMessage;
        }

        @Override
        protected void populateViewHolder(final MessageViewHolder messageViewHolder,
                                          FriendlyMessage friendlyMessage, int position) {
            mProgressBar.setVisibility(ProgressBar.INVISIBLE);
            if(friendlyMessage.getText() != null){

                // write this message to the on-device index
                FirebaseAppIndex.getInstance().update(getMessageIndexable(friendlyMessage));
                Log.d(TAG, friendlyMessage.getText());
                // log a view action on it
                FirebaseUserActions.getInstance().end(getMessageViewAction(friendlyMessage));

                messageViewHolder.messageTextView.setText(friendlyMessage.getText());
                messageViewHolder.messageTextView.setVisibility(TextView.VISIBLE);
                messageViewHolder.messageImageView.setVisibility(ImageView.GONE);

            } else {
                String imageUrl = friendlyMessage.getImageUrl();
                if(imageUrl.startsWith("gs://")){
                    StorageReference storageReference = FirebaseStorage.getInstance()
                            .getReferenceFromUrl(imageUrl);
                    storageReference.getDownloadUrl().addOnCompleteListener(
                            new OnCompleteListener<Uri>() {
                                @Override
                                public void onComplete(@NonNull Task<Uri> task) {
                                    if (task.isSuccessful()){
                                        String downloadUrl = task.getResult().toString();
                                        Glide.with(messageViewHolder.messageImageView.getContext())
                                                .load(downloadUrl)
                                                .into(messageViewHolder.messageImageView);
                                    } else {
                                        Log.w(TAG, "Getting download url was not successful.",
                                                task.getException());
                                    }
                                }
                            }
                    );
                } else {
                    Glide.with(messageViewHolder.messageImageView.getContext())
                            .load(friendlyMessage.getImageUrl())
                            .into(messageViewHolder.messageImageView);
                }
                messageViewHolder.messageImageView.setVisibility(ImageView.VISIBLE);
                messageViewHolder.messageTextView.setVisibility(TextView.GONE);
            }

            messageViewHolder.messengerTextView.setText(friendlyMessage.getName());
            if( friendlyMessage.getPhotoUrl() == null){
                messageViewHolder.messengerImageView.setImageDrawable(ContextCompat.getDrawable(MainActivity.this,
                        R.drawable.ic_account_circle_black_36dp));
            } else {
                Glide.with(MainActivity.this)
                        .load(friendlyMessage.getPhotoUrl())
                        .into(messageViewHolder.messengerImageView);
            }
        }
    };

    mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver(){
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            int friendlyMessageCount = mFirebaseAdapter.getItemCount();
            int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();

            // If the recycler view is initially being loaded or the
            // user is at the bottom of the list, scroll to the bottom
            // of the list to show the newly added message
             if (lastVisiblePosition == -1 ||
                     (positionStart >= (friendlyMessageCount - 1) &&
                     lastVisiblePosition == (positionStart -1))){
                 mMessageRecyclerView.scrollToPosition(positionStart);
             }
        }
    });

    mMessageRecyclerView.setAdapter(mFirebaseAdapter);

    mMessageEditText = (EditText) findViewById(R.id.messageEditText);
    mMessageEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(mSharedPreferences
            .getInt(CodelabPreferences.FRIENDLY_MSG_LENGTH, DEFAULT_MSG_LENGTH_LIMIT))});
    mMessageEditText.addTextChangedListener(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) {
            if (charSequence.toString().trim().length() > 0) {
                mSendButton.setEnabled(true);
            } else {
                mSendButton.setEnabled(false);
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {
        }
    });

    mSendButton = (Button) findViewById(R.id.sendButton);
    mSendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Send messages on click.
            FriendlyMessage friendlyMessage = new
                    FriendlyMessage(mMessageEditText.getText().toString(),
                    mUsername,
                    mPhotoUrl,
                    null /* no image */);
            mFirebaseDatabaseReference.child(MESSAGES_CHILD)
                    .push().setValue(friendlyMessage);
            mMessageEditText.setText("");
        }
    });

    mAddMessageImageView = (ImageView) findViewById(R.id.addMessageImageView);
    mAddMessageImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Select image for image message on click.
            Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType("image/*");
            startActivityForResult(intent, REQUEST_IMAGE);
        }
    });
}

@Override
public void onStart() {
    super.onStart();
    // Check if user is signed in.
    // TODO: Add code to check if user is signed in.
}

@Override
public void onPause() {
    super.onPause();
}

@Override
public void onResume() {
    super.onResume();
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult: requestCode=" + requestCode + ", resultCode=" + resultCode);

    if(requestCode == REQUEST_IMAGE){
        if(resultCode == RESULT_OK) {
            if(data != null){
                final Uri uri = data.getData();
                Log.d(TAG, "Uri: " + uri.toString());

                FriendlyMessage tempMessage = new FriendlyMessage(null, mUsername, mPhotoUrl,
                        LOADING_IMAGE_URL);
                mFirebaseDatabaseReference.child(MESSAGES_CHILD).push()
                        .setValue(tempMessage, new DatabaseReference.CompletionListener(){
                            @Override
                            public void onComplete(DatabaseError databaseError,
                                                   DatabaseReference databaseReference){
                                if(databaseError == null){
                                    String key = databaseReference.getKey();
                                    StorageReference storageReference =
                                            FirebaseStorage.getInstance()
                                            .getReference(mFirebaseUser.getUid())
                                            .child(key)
                                            .child(uri.getLastPathSegment());

                                    putImageInStorage(storageReference, uri, key);
                                } else {
                                    Log.w(TAG, "Unable to write message to database.",
                                            databaseError.toException());
                                }
                            }
                        });
            }
        }
    }
}


private void putImageInStorage(StorageReference storageReference, Uri uri, final String key){
    storageReference.putFile(uri).addOnCompleteListener(MainActivity.this,
            new OnCompleteListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                    if(task.isSuccessful()){
                        FriendlyMessage friendlyMessage =
                                new FriendlyMessage(null, mUsername, mPhotoUrl,
                                        task.getResult().getMetadata().getDownloadUrl()
                                .toString());
                        mFirebaseDatabaseReference.child(MESSAGES_CHILD).child(key)
                                .setValue(friendlyMessage);
                    } else {
                        Log.w(TAG, "Image upload task was not successful.",
                                task.getException());
                    }
                }
            });
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.sign_out_menu:
            mFirebaseAuth.signOut();
            Auth.GoogleSignInApi.signOut(mGoogleApiClient);
            mUsername = ANONYMOUS;
            startActivity(new Intent(this, SignInActivity.class));
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    // An unresolvable error has occurred and Google APIs (including Sign-In) will not
    // be available.
    Log.d(TAG, "onConnectionFailed:" + connectionResult);
    Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show();
}


private Indexable getMessageIndexable(FriendlyMessage friendlyMessage) {
    PersonBuilder sender = Indexables.personBuilder()
            .setIsSelf(mUsername.equals(friendlyMessage.getName()))
            .setName(friendlyMessage.getName())
            .setUrl(MESSAGE_URL.concat(friendlyMessage.getId() + "/sender"));

    PersonBuilder recipient = Indexables.personBuilder()
            .setName(mUsername)
            .setUrl(MESSAGE_URL.concat(friendlyMessage.getId() + "/recipient"));

    Indexable messageToIndex = Indexables.messageBuilder()
            .setName(friendlyMessage.getText())
            .setUrl(MESSAGE_URL.concat(friendlyMessage.getId()))
            .setSender(sender)
            .setRecipient(recipient)
            .build();

    return messageToIndex;
}

private Action getMessageViewAction(FriendlyMessage friendlyMessage){
    return new Action.Builder(Action.Builder.VIEW_ACTION)
            .setObject(friendlyMessage.getName(), MESSAGE_URL.concat(friendlyMessage.getId()))
            .setMetadata(new Action.Metadata.Builder().setUpload(false))
            .build();
}

1 个答案:

答案 0 :(得分:-1)

如果你从复制/粘贴中获取,那只是关于错误的地方代码,请尝试

  1. 从Android Studio,在工具栏上点击&#34; CODE &#34;然后选择&#34; REARRANGE CODE &#34;比试试&#34; RUN &#34;试。
  2. 或尝试查看 android 文件夹中原始 MainActivity.java 的示例 而是 android-start https://github.com/firebase/friendlychat-android存储库