Android 拍照与从相册选取图片时,图片不显示的问题

前天手欠,打开了项目里的选图片模块,突然发现拍照和选取图片都没有问题,但是图片死活都不能显示在imageview上,真特么的日了狗了,当初为了这个功能 demo写了不下10个,而且测试也没问题了,最重要的是我什么也没有动啊,没辙,改把。流程如下:

1、从网上找了一个demo,运行没有问题,靠近项目里,日了狗了,

2、网上百度,没有。。。。。

3、群里问大神,大神说4.4的API有变化可能有影响,网上找了一个 加了一个判断,然后。。。。。再日狗。

4、大神成都-码夫小兄弟帮远程了一下。。各种改,眼花缭乱啊,最后debug,发现根本没有返回数据,兄弟仗义,晚上给弄了个demo,今天早上我下下来一看。。。。愣是没看出和我原来的代码有什么大的不同。。。。然后把代码考进去,,,,,运行,,,,麻痹日狗都不能满足我了。

5.最后发狠了   把项目里那个类的代码复制了  重新建项目贴进去,布局图片的什么都一样,运行。。。。。成功惊恐妈蛋 ,居然成功了,万头草泥马从我身上碾过去,有没有?继续--代码布局一样  唯一不同的就是清单了, android:launchMode="singleInstance"我项目类对应的清单里多了一个这个,忘记是因为什么而加上的的了,删了,运行不通,<intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

这个 加项目对应类的清单里  ,这样就一模一样了,运行成功,运行成功,运行成功,艹,成功了 成功了!但是为毛啊,码夫小兄弟说这个毛都不沾边的设置啊,擦,删了运行,奇迹的时候,又成功了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!麻痹的,不说脏话不能表现我的心情啊,,,,,,,,

总结:android:launchMode="singleInstance"应该就是这个设置出了问题,单例。网上查说这个东西的作用是保障Activity 的唯一,但是拍照等操作的时候实际上是走了3个Activity ,1、是原本的Activity 2、是拍照时或选图片的Activity 3、是返回结果到原来的Activity 。这时,问题来了。我已经设置单一了,肯定不能出去再回来了。。。。。

public class PublishActivity extends Activity {
private static final String TAG = "PublishActivity";
private static final int PHOTO_CARMERA = 1;
private static final int PHOTO_PICK = 2;

@ViewInject(R.id.iv_publish_Pic)ImageView iv_publish_Pic;
@ViewInject(R.id.iv_Camera)ImageView iv_Camera;
@ViewInject(R.id.iv_Album)ImageView iv_Album;

File file;
String picname;
SharedPreferences spf;
long currentTimeMillis;


private int width;  
private int height;  

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.publish);

ViewUtils.inject(this);


picname="f_"+spf.getString("_id", "")+"_"+System.currentTimeMillis()/1000 +".png";
Log.i(TAG, picname);
file=new File(Environment.getExternalStorageDirectory(), picname);


Display display = getWindowManager().getDefaultDisplay();  
width = display.getWidth();  
height = display.getHeight();


}            
/**
* 点击监听
* @param v
*/
@OnClick({R.id.iv_black_pulish,R.id.tv_wenda_pulish,R.id.tv_ok_pulish,R.id.iv_Camera,R.id.iv_Album})
public void onClick(View v){
switch (v.getId()) {
case R.id.iv_black_pulish:
startActivity(new Intent(this,PublishActivity.class));
finish();
break;
case R.id.iv_Camera:
startCamera();// 调用拍照
break;
case R.id.iv_Album:
startPick();// 调用相册
break;
}
}
// 调用系统相机
protected void startCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, PHOTO_CARMERA);
}
// 调用系统相册
protected void startPick() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, PHOTO_PICK);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (Environment.getExternalStorageState().equals(Environment.MEDIA_UNKNOWN)) {
Toast.makeText(this, "SD卡不可用", 1000).show();
return;
}
if (resultCode == -1) {
switch (requestCode) {
case PHOTO_CARMERA:
Options options = new Options();  
options.inJustDecodeBounds = true;//设置解码只是为了获取图片的width和height值,而不是真正获取图片  
Bitmap bitmap = BitmapFactory.decodeFile(file.getPath(), options);//解码后可以options.outWidth和options.outHeight来获取图片的尺寸  


int widthRatio = (int) Math.ceil(options.outWidth / width);//获取宽度的压缩比率  
int heightRatio = (int) Math.ceil(options.outHeight / height);//获取高度的压缩比率  


if (widthRatio > 1 || heightRatio > 1) {//只要其中一个的比率大于1,说明需要压缩  
if(widthRatio>=heightRatio){//取options.inSampleSize为宽高比率中的最大值  
options.inSampleSize = widthRatio;  
}else{  
options.inSampleSize = heightRatio;  
}  
}  


options.inJustDecodeBounds = false;//设置为真正的解码图片  
bitmap = BitmapFactory.decodeFile(file.getPath(), options);//解码图片 
iv_publish_Pic.setImageBitmap(null);
iv_publish_Pic.setImageBitmap(bitmap);
break;
case PHOTO_PICK:
if (null != data) {
setPicToView(data.getData());
}
break;
}
}

}
private void setPicToView(Uri data) {


/**
* 当选择的图片不为空的话,在获取到图片的途径  
*/
Uri uri=data;
Cursor c=getContentResolver().query(uri, null, null, null, null);
if (c.moveToNext()) {
String path=c.getString(c.getColumnIndex(Images.Media.DATA));


Log.i(tag, path);
file=new File(path);
Options options = new Options();  
options.inJustDecodeBounds = true;//设置解码只是为了获取图片的width和height值,而不是真正获取图片  
Bitmap bitmap = BitmapFactory.decodeFile(file.getPath(), options);//解码后可以options.outWidth和options.outHeight来获取图片的尺寸  


int widthRatio = (int) Math.ceil(options.outWidth / width);//获取宽度的压缩比率  
int heightRatio = (int) Math.ceil(options.outHeight / height);//获取高度的压缩比率  


if (widthRatio > 1 || heightRatio > 1) {//只要其中一个的比率大于1,说明需要压缩  
if(widthRatio>=heightRatio){//取options.inSampleSize为宽高比率中的最大值  
options.inSampleSize = widthRatio;  
}else{  
options.inSampleSize = heightRatio;  
}  
}  


options.inJustDecodeBounds = false;//设置为真正的解码图片  
bitmap = BitmapFactory.decodeFile(file.getPath(), options);//解码图片 
Log.i(tag, file.getPath());
saveMyBitmap(bitmap,file.getName());
iv_publish_Pic.setImageBitmap(null);
iv_publish_Pic.setImageBitmap(bitmap);
}
}
public void saveMyBitmap(Bitmap mBitmap,String bitName)  {
file= new File( Environment.getExternalStorageDirectory(),picname);
Log.i(tag, file.getPath());
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
Log.i("info2", "name="+file.getName()+"\n\n path="+file.getPath());
}


}

基础啊。。。。我心中的痛。。。


有别想法的大神可以留言或加群261053948指教。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
好的,以下是Android拍照或者从相册选取图片加载在imageview上的具体步骤: 1. 在AndroidManifest.xml文件中添加相机和存储权限: ``` <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 在布局文件中添加一个ImageView: ``` <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 3. 在Activity中定义以下变量: ``` private static final int REQUEST_IMAGE_CAPTURE = 1; private static final int REQUEST_IMAGE_PICK = 2; private ImageView imageView; private Uri imageUri; ``` 4. 在需要拍照或者从相册选取图片的地方,添加以下代码: 拍照: ``` Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { File photoFile = null; try { photoFile = createImageFile(); } catch (IOException e) { e.printStackTrace(); } if (photoFile != null) { imageUri = FileProvider.getUriForFile(this, "com.example.fileprovider", photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } ``` 从相册选取图片: ``` Intent pickPhotoIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(pickPhotoIntent, REQUEST_IMAGE_PICK); ``` 5. 在Activity中添加以下方法: ``` @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == REQUEST_IMAGE_CAPTURE) { imageView.setImageURI(imageUri); } else if (requestCode == REQUEST_IMAGE_PICK) { imageUri = data.getData(); imageView.setImageURI(imageUri); } } } private File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File imageFile = File.createTempFile(imageFileName, ".jpg", storageDir); return imageFile; } ``` 以上就是Android拍照或者从相册选取图片加载在ImageView上的完整代码,希望可以帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值