我的聊天应用程序工作正常,但当我发送任何pdf或文档文件时,它会成功上传到firebase存储和数据库中。但是当我尝试下载文件时,它给出了一个错误,没有找到任何活动来处理intent。
消息适配器代码
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>
{
private List<Messages> userMessagesList;
private FirebaseAuth mAuth;
private DatabaseReference usersRef;
public MessageAdapter(List<Messages> userMessagesList)
{
this.userMessagesList = userMessagesList;
}
public class MessageViewHolder extends RecyclerView.ViewHolder
{
public TextView senderMessageText, receiverMessageText;
public CircleImageView receiverProfileImage;
public ImageView messageSenderPicture, messageReceiverPicture;
public MessageViewHolder(@NonNull View itemView)
{
super(itemView);
senderMessageText = (TextView) itemView.findViewById(R.id.sender_message_text);
receiverMessageText = (TextView) itemView.findViewById(R.id.receiver_message_text);
receiverProfileImage = (CircleImageView) itemView.findViewById(R.id.message_profile_image);
messageReceiverPicture = itemView.findViewById(R.id.message_receiver_image_view);
messageSenderPicture = itemView.findViewById(R.id.message_sender_image_view);
}
}
@NonNull
@Override
public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
{
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.custom_messages_layout, viewGroup, false);
mAuth = FirebaseAuth.getInstance();
return new MessageViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MessageViewHolder messageViewHolder, final int position)
{
String messageSenderID = mAuth.getCurrentUser().getUid();
Messages messages = userMessagesList.get(position);
String fromUserID = messages.getFrom();
String fromMessageType = messages.getType();
usersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(fromUserID);
usersRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
if (dataSnapshot.hasChild("image"))
{
String receiverImage = dataSnapshot.child("image").getValue().toString();
Picasso.get().load(receiverImage).placeholder(R.drawable.profile_image).into(messageViewHolder.receiverProfileImage);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
}
});
messageViewHolder.receiverMessageText.setVisibility(View.GONE);
messageViewHolder.receiverProfileImage.setVisibility(View.GONE);
messageViewHolder.senderMessageText.setVisibility(View.GONE);
messageViewHolder.messageSenderPicture.setVisibility(View.GONE);
messageViewHolder.messageReceiverPicture.setVisibility(View.GONE);
if (fromMessageType.equals("text"))
{
if (fromUserID.equals(messageSenderID))
{
messageViewHolder.senderMessageText.setVisibility(View.VISIBLE);
messageViewHolder.senderMessageText.setBackgroundResource(R.drawable.sender_messages_layout);
messageViewHolder.senderMessageText.setTextColor(Color.BLACK);
messageViewHolder.senderMessageText.setText(messages.getMessage() + "\n \n" + messages.getTime() + " - " + messages.getDate());
}
else
{
messageViewHolder.receiverProfileImage.setVisibility(View.VISIBLE);
messageViewHolder.receiverMessageText.setVisibility(View.VISIBLE);
messageViewHolder.receiverMessageText.setBackgroundResource(R.drawable.receiver_messages_layout);
messageViewHolder.receiverMessageText.setTextColor(Color.BLACK);
messageViewHolder.receiverMessageText.setText(messages.getMessage() + "\n \n" + messages.getTime() + " - " + messages.getDate());
}
}
else if (fromMessageType.equals("image"))
{
if (fromUserID.equals(messageSenderID))
{
messageViewHolder.messageSenderPicture.setVisibility(View.VISIBLE);
Picasso.get().load(messages.getMessage()).into(messageViewHolder.messageSenderPicture);
}
else
{
messageViewHolder.receiverProfileImage.setVisibility(View.VISIBLE);
messageViewHolder.messageReceiverPicture.setVisibility(View.VISIBLE);
Picasso.get().load(messages.getMessage()).into(messageViewHolder.messageReceiverPicture);
}
}
else if (fromMessageType.equals("pdf") || fromMessageType.equals("docx"))
{
if (fromUserID.equals(messageSenderID))
{
messageViewHolder.messageSenderPicture.setVisibility(View.VISIBLE);
Picasso.get()
.load("https://firebasestorage.googleapis.com/v0/b/whatsapp-11072000.appspot.com/o/Image%20Files%2Ffile.png?alt=media&token=664c6fd5-89fb-41c8-9db9-85b825deea40")
.into(messageViewHolder.messageSenderPicture);
}
else
{
messageViewHolder.receiverProfileImage.setVisibility(View.VISIBLE);
messageViewHolder.messageReceiverPicture.setVisibility(View.VISIBLE);
Picasso.get()
.load("https://firebasestorage.googleapis.com/v0/b/whatsapp-11072000.appspot.com/o/Image%20Files%2Ffile.png?alt=media&token=664c6fd5-89fb-41c8-9db9-85b825deea40")
.into(messageViewHolder.messageReceiverPicture);
}
}
if (fromUserID.equals(messageSenderID))
{
messageViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
if (userMessagesList.get(position).getType().equals("pdf") || userMessagesList.get(position).getType().equals("docx"))
{
CharSequence options[] = new CharSequence[]
{
"Delete for Me",
"Download and View this Document",
"Cancel",
"Delete for Everyone"
};
AlertDialog.Builder builder = new AlertDialog.Builder(messageViewHolder.itemView.getContext());
builder.setTitle("Delete Message?");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
if (i == 0)
{
deleteSentMessage(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
else if (i == 1)
{
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(userMessagesList.get(position).getMessage()));
messageViewHolder.itemView.getContext().startActivity(intent);
}
else if (i == 3)
{
deleteMessageForEveryone(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
}
});
builder.show();
}
else if (userMessagesList.get(position).getType().equals("text"))
{
CharSequence options[] = new CharSequence[]
{
"Delete for Me",
"Cancel",
"Delete for Everyone"
};
AlertDialog.Builder builder = new AlertDialog.Builder(messageViewHolder.itemView.getContext());
builder.setTitle("Delete Message?");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
if (i == 0)
{
deleteSentMessage(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
else if (i == 2)
{
deleteMessageForEveryone(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
}
});
builder.show();
}
else if (userMessagesList.get(position).getType().equals("image"))
{
CharSequence options[] = new CharSequence[]
{
"Delete for Me",
"View this Image",
"Cancel",
"Delete for Everyone"
};
AlertDialog.Builder builder = new AlertDialog.Builder(messageViewHolder.itemView.getContext());
builder.setTitle("Delete Message?");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
if (i == 0)
{
deleteSentMessage(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
else if (i == 1)
{
Intent intent = new Intent(messageViewHolder.itemView.getContext(), ImageViewerActivity.class);
intent.putExtra("url", userMessagesList.get(position).getMessage());
messageViewHolder.itemView.getContext().startActivity(intent);
}
else if (i == 3)
{
deleteMessageForEveryone(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
}
});
builder.show();
}
}
});
}
else
{
messageViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
if (userMessagesList.get(position).getType().equals("pdf") || userMessagesList.get(position).getType().equals("docx"))
{
CharSequence options[] = new CharSequence[]
{
"Delete for Me",
"Download and View this Document",
"Cancel"
};
AlertDialog.Builder builder = new AlertDialog.Builder(messageViewHolder.itemView.getContext());
builder.setTitle("Delete Message?");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
if (i == 0)
{
deleteReceiveMessage(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
else if (i == 1)
{
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(userMessagesList.get(position).getMessage()));
messageViewHolder.itemView.getContext().startActivity(intent);
}
}
});
builder.show();
}
else if (userMessagesList.get(position).getType().equals("text"))
{
CharSequence options[] = new CharSequence[]
{
"Delete for Me",
"Cancel"
};
AlertDialog.Builder builder = new AlertDialog.Builder(messageViewHolder.itemView.getContext());
builder.setTitle("Delete Message?");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
if (i == 0)
{
deleteReceiveMessage(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
}
});
builder.show();
}
else if (userMessagesList.get(position).getType().equals("image"))
{
CharSequence options[] = new CharSequence[]
{
"Delete for Me",
"View this Image",
"Cancel"
};
AlertDialog.Builder builder = new AlertDialog.Builder(messageViewHolder.itemView.getContext());
builder.setTitle("Delete Message?");
builder.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
if (i == 0)
{
deleteReceiveMessage(position, messageViewHolder);
Intent intent = new Intent(messageViewHolder.itemView.getContext(), MainActivity.class);
messageViewHolder.itemView.getContext().startActivity(intent);
}
else if (i == 1)
{
Intent intent = new Intent(messageViewHolder.itemView.getContext(), ImageViewerActivity.class);
intent.putExtra("url", userMessagesList.get(position).getMessage());
messageViewHolder.itemView.getContext().startActivity(intent);
}
}
});
builder.show();
}
}
});
}
}
@Override
public int getItemCount()
{
return userMessagesList.size();
}
private void deleteSentMessage(final int position, final MessageViewHolder holder)
{
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("Messages")
.child(userMessagesList.get(position).getFrom())
.child(userMessagesList.get(position).getTo())
.child(userMessagesList.get(position).getMessageID())
.removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task)
{
if (task.isSuccessful())
{
Toast.makeText(holder.itemView.getContext(), "Deleted Successfully...", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(holder.itemView.getContext(), "Error Occurred", Toast.LENGTH_SHORT).show();
}
}
});
}
private void deleteReceiveMessage(final int position, final MessageViewHolder holder)
{
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("Messages")
.child(userMessagesList.get(position).getTo())
.child(userMessagesList.get(position).getFrom())
.child(userMessagesList.get(position).getMessageID())
.removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task)
{
if (task.isSuccessful())
{
Toast.makeText(holder.itemView.getContext(), "Deleted Successfully...", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(holder.itemView.getContext(), "Error Occurred", Toast.LENGTH_SHORT).show();
}
}
});
}
private void deleteMessageForEveryone(final int position, final MessageViewHolder holder)
{
final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("Messages")
.child(userMessagesList.get(position).getTo())
.child(userMessagesList.get(position).getFrom())
.child(userMessagesList.get(position).getMessageID())
.removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task)
{
if (task.isSuccessful())
{
rootRef.child("Messages")
.child(userMessagesList.get(position).getFrom())
.child(userMessagesList.get(position).getTo())
.child(userMessagesList.get(position).getMessageID())
.removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task)
{
if (task.isSuccessful())
{
Toast.makeText(holder.itemView.getContext(), "Deleted Successfully...", Toast.LENGTH_SHORT).show();
}
}
});
}
else
{
Toast.makeText(holder.itemView.getContext(), "Error Occurred", Toast.LENGTH_SHORT).show();
}
}
});
}
}
清单文件代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="rishabh.example.whatsapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ImageViewerActivity"></activity>
<activity
android:name=".ChatActivity"
android:parentActivityName=".MainActivity" />
<activity android:name=".ProfileActivity" />
<activity android:name=".PhoneLoginActivity" />
<activity android:name=".GroupChatActivity" />
<activity
android:name=".SettingsActivity"
android:parentActivityName=".MainActivity" />
<activity android:name=".RegisterActivity" />
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".FindFriendsActivity"
android:parentActivityName=".MainActivity" />
<activity
android:name=".MainActivity">
</activity>
</application>
</manifest>
错误是在第行中未找到处理意图的活动
messageViewHolder.itemView.getContext().startActivity(intent);
我的日志错误是
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=com.google.android.gms.tasks.zzu@8126f0 }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2066)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1720)
at android.app.Activity.startActivityForResult(Activity.java:5258)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
at android.app.Activity.startActivityForResult(Activity.java:5216)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
at android.app.Activity.startActivity(Activity.java:5587)
at android.app.Activity.startActivity(Activity.java:5555)
at rishabh.example.whatsapp.MessageAdapter$3$1.onClick(MessageAdapter.java:317)
at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1222)
at android.widget.AdapterView.performItemClick(AdapterView.java:330)
at android.widget.AbsListView.performItemClick(AbsListView.java:1219)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3230)
at android.widget.AbsListView$3.run(AbsListView.java:4186)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
1条答案
按热度按时间dced5bon1#
第一个解决方案
url地址必须以http://或https开头://
所以,检查你的下载网址是否正确。
第二种解决方案
尝试将此添加到清单