Android未选图片上传崩溃:添加判断后仍崩溃的原因及解决
问题分析:未选择图片时上传崩溃的原因与修复方案
你遇到的核心问题是:明明在按钮点击事件里加了图片存在性判断,但未选择图片时点击上传依然崩溃。我帮你拆解下问题根源和解决办法:
问题出在哪?
你的判断逻辑hasImage(imageView)大概率没有正确检测到ImageView是否真的加载了用户选择的图片,常见原因有两种:
hasImage方法的实现逻辑错误:比如你可能是通过判断ImageView.getDrawable() != null来判断,但如果你的ImageView在布局里默认设置了占位图(比如android:src属性),或者系统默认给ImageView分配了空Drawable对象,这个判断会一直返回true,导致即使没选图片也会触发上传。- 判断依据和实际图片状态脱节:你实际用来上传的是成员变量
bitmap,但判断时却用了ImageView的状态。只有在成功选择图片时bitmap才会被赋值,未选择时bitmap是null,但你的判断逻辑没关联这个变量,导致判断失效后,ImageUploadToServerFunction()拿到null的bitmap直接崩溃。
另外,你的代码里还有个小疏漏:SelectImageGallery变量没有在类里声明,这会导致编译错误,得补上。
解决方案
方案一:直接判断成员变量bitmap(最可靠)
既然你上传用的是bitmap变量,那直接判断它是否为null是最准确的:
public class MainActivity extends AppCompatActivity { ImageView imageView; Bitmap bitmap; // 声明为类成员变量 ImageButton SelectImageGallery; // 补上变量声明 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_anghinzu); imageView = (ImageView)findViewById(R.id.ivFoto); SelectImageGallery = (ImageButton)findViewById(R.id.btnChoose); // ... 其他初始化代码 } public void OnButton(View view) { //Upload Image if (bitmap != null) { ImageUploadToServerFunction(); } else { Toast.makeText(MainActivity.this, "Kein Bild ausgewählt!", Toast.LENGTH_LONG).show(); } } }
方案二:修复hasImage的判断逻辑(如果坚持用ImageView判断)
如果一定要基于ImageView的状态判断,可以通过Tag标记来区分默认状态和已选图片状态:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_anghinzu); imageView = (ImageView)findViewById(R.id.ivFoto); imageView.setTag(false); // 初始化标记:未选图片 SelectImageGallery = (ImageButton)findViewById(R.id.btnChoose); // ... 其他代码 } @Override protected void onActivityResult(int RC, int RQC, Intent I) { super.onActivityResult(RC, RQC, I); if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) { Uri uri = I.getData(); try { bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); imageView.setImageBitmap(bitmap); imageView.setTag(true); // 标记:已选图片 } catch (IOException e) { e.printStackTrace(); } } } public void OnButton(View view) { Boolean hasSelectedImage = (Boolean) imageView.getTag(); // 只有标记为true时才触发上传 if (hasSelectedImage != null && hasSelectedImage) { ImageUploadToServerFunction(); } else { Toast.makeText(MainActivity.this, "Kein Bild ausgewählt!", Toast.LENGTH_LONG).show(); } }
额外的安全保障
为了彻底避免崩溃,建议在ImageUploadToServerFunction()里也加一层null判断:
public void ImageUploadToServerFunction(){ if(bitmap == null){ Toast.makeText(MainActivity.this, "Kein Bild zum Hochladen!", Toast.LENGTH_SHORT).show(); return; } // 你的上传逻辑代码 }
内容的提问来源于stack exchange,提问作者H. Bauer
相关产品推荐
相关产品推荐

