我的问题
我用我的android设备拍照.然后我从文件中解码该图片.
Bitmap photo = BitmapFactory.decodeFile(EXTERNAL_IMAGE_PATH+File.separator+this._currentPhotoName+JPEG_FILE_SUFFIX);
if (photo == null && data != null)
photo = (Bitmap) data.getExtras().get("data");
else if (data == null && photo == null)
Log.e("CCPhotoManager","Can't find image from file or from intent data.");
Run Code Online (Sandbox Code Playgroud)
然后,我检查该图片,看看是否需要将其旋转到正确的方向.
try {
ExifInterface exif = new ExifInterface(EXTERNAL_IMAGE_PATH+File.separator+this._currentPhotoName+JPEG_FILE_SUFFIX);
int rotation = CCDataUtils.exifToDegrees(exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL));
Log.v("CCPhotoManager", "Rotation:"+rotation);
if (rotation > 0) {
photo = this.convertSavedImageToCorrectOrientation(EXTERNAL_IMAGE_PATH+File.separator+this._currentPhotoName+JPEG_FILE_SUFFIX, photo, rotation);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
如果它确实需要旋转我调用这个方法.
public Bitmap convertSavedImageToCorrectOrientation(String filePath,Bitmap photo,int rotation) …Run Code Online (Sandbox Code Playgroud) 这不是Android开发者控制台中神秘堆栈跟踪的重复(位图大小超过32位)
这个问题没有提供单行代码,也没有答案; 此外,即使我将位图大小设置为32x32,我也会收到此错误,它是唯一的Bitmap,因此它与内存无关.
我想做的事
所述Log.e用于ImageView的大小,因此位图输出为:
Width: 272
Height: 136
Run Code Online (Sandbox Code Playgroud)
怎么了
以下代码适用于Nexus4,Nexus7和Desire HD(CM10),但在模拟器上运行应用程序会给出如下所示的错误(API 8).
发现
我尝试过它的一半大小和32x32,这给出了同样的错误.
我在DialogFragment中显示ImageView(针对API 8的ActionBarSherlock/HoloEveryWhere),也许这就是罪魁祸首?
ImageView的:
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="12dp"
android:layout_marginTop="12dp" />
Run Code Online (Sandbox Code Playgroud)
在我的活动中:
iv = (ImageView) view.findViewById(R.id.imageView1);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (!waveFormMeasured) {
if (iv.getMeasuredWidth() > 1) {
width = iv.getMeasuredWidth();
Log.e(TAG, "Width: " + width + " Height: " + width / 2);
waveBitmap = Bitmap.createBitmap((int) width, …Run Code Online (Sandbox Code Playgroud) 我想创建一个动态图像视图,其中我的图库中的每个图像将使用bitmapfactory而不是图像视图中绑定的图像drawable.是否有一些网站有这方面的bitmapfactory教程?我相信使用bitmapfactory使用较少的内存将图像绑定到图像视图中?这是正确的吗?我还希望尽量减少内存泄漏的风险,这就是我想使用bitmapfactory的原因.请帮忙.我找不到教会bitmapfactory的基本例子.
我现在已经尝试了一千次来自己解决这个问题而没有任何成功.我已经记录并调试了应用程序,根据我收集的信息,这是一个用于动画的大型spritesheet.这是一个大小为3000x1614像素的.png.spritesheet中有10x6个精灵,对于动画来说是必不可少的.精灵之间没有任何差距,使其尽可能保持内存效率.
这是我的方法,我将我的位图加载,解码并调整大小为用户手机与手机的宽高比,我正在构建游戏:
public Pixmap newResizedPixmap(String fileName, PixmapFormat format, double Width, double Height) {
// TODO Auto-generated method stub
Config config = null;
if (format == PixmapFormat.RGB565)
config = Config.RGB_565;
else if (format == PixmapFormat.ARGB4444)
config = Config.ARGB_4444;
else
config = Config.ARGB_8888;
Options options = new Options();
options.inPreferredConfig = config;
options.inPurgeable=true;
options.inInputShareable=true;
options.inDither=false;
InputStream in = null;
Bitmap bitmap = null;
try {
//OPEN FILE INTO INPUTSTREAM
in = assets.open(fileName);
//DECODE INPUTSTREAM
bitmap = BitmapFactory.decodeStream(in, null, options);
if (bitmap == null) …Run Code Online (Sandbox Code Playgroud) 当我尝试从我的Android应用程序上传图像或更大的文件时,它会崩溃并出现OutOfMemoryException.我想知道是否有其他方法可以做到这一点.
我在两个不同的地方崩溃了应用程序:
Base64.encodeToString(bytes, Base64.DEFAULT);
Run Code Online (Sandbox Code Playgroud)
这里base64字符串是nameValuPairs集合中的值之一.
HttpClient client = new DefaultHttpClient();
HttpPost httppost = new HttpPost(uo.WebServiceURL);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs); // On this line
httppost.setEntity(entity);
HttpResponse response = client.execute(httppost);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我看到我的堆越来越多了,我知道它会最终在任何设备上崩溃,因为它会不断增长.
Grow heap (frag case)
在整个日志中都可以看到
在我的手机上它会使用32mb的应用程序崩溃.其他手机当然是16mb,如果有少量资源运行Android 2.2
现在,我正在使用recycle()我的位图,将事物设置为null,从复杂数据结构中弹出项目,以及System.gc()在整个应用程序中使用调用垃圾收集
但是,堆仍然在增长并且最终会出现问题
我如何强制应用程序转储资源,以便它可以继续运行.
它通常总是"位图vm预算"超过,但我感觉越来越多,我只是无法访问"clear bitmap vm"命令
我的应用程序允许用户使用他们的设备相机应用程序拍摄照片,这些照片应用程序将保存到特定应用程
然后,用户可以选择将他们选择的任何图像发送到他们的某个联系人,使用他们选择的设备电子邮件应用.

可悲的是,"选择要发送的图像"对话框最初需要很长时间才能加载,并且在滚动时非常"不稳定"(频繁显着的暂停).我怀疑这是因为图像非常大 - 用我的相机拍摄的照片大约是每个2.3MB.因此,初始屏幕(显示15个图像)需要在磁盘可以渲染之前将其拉出34.5MB左右.
<!-- ... -->
<GridView
android:id="@+id/gvSelectImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:numColumns="3"
android:gravity="center" />
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
File pic = pics[position];
View checkedImageView =
LayoutInflater.from(context).inflate(R.layout.checked_image,
parent, false);
final ImageView imageView =
(ImageView) checkedImageView.findViewById(R.id.checkableImage);
/* LOAD IMAGE TO DISPLAY */
//imageView.setImageURI(pic.toURI())); // "exceeds VM budget"
Bitmap image;
try {
int imageWidth = 100;
image = getBitmapFromFile(pic, imageWidth); // TODO: slooow...
} catch (IOException e) { …Run Code Online (Sandbox Code Playgroud) 我释放了每个对象,回收onDestroy()方法中的所有位图:
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
@Override
protected void onDestroy()
{
super.onDestroy();
unbindDrawables(findViewById(R.id.RootView));
bitmap.recycle();
bitmap=null;
System.gc();
}
Run Code Online (Sandbox Code Playgroud)
我已经在每个类onDestroy()方法中完成了这个编码.但我的logcat仍然显示错误如:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{}: android.view.InflateException: Binary XML file line #2: Error inflating class android.widget.RelativeLayout
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
android.app.ActivityThread.access$600(ActivityThread.java:123)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:4424)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
dalvik.system.NativeStart.main(Native …Run Code Online (Sandbox Code Playgroud) 我对将图像视图设置为相机拍摄的照片感兴趣。相机应用程序运行良好,并且将图像保存在sd卡中的适当位置,但是当我尝试加载图像并将其设置为图像视图时,它保持空白。除了使用最近拍摄的图像的路径之外,我还尝试对现有图像的路径进行硬编码,但是遇到了同样的问题。我检查了其他线程,但是看不到代码中的任何差异。
这是相机功能:
private void takePicture(){
Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "/resources/resources/WI"+job_num);
image_name = username+"_"+date+".png";
File image_file = new File(imagesFolder, image_name);
while(image_file.exists()){
image_name = username+"-"+date+"("+ image_count+").png";
image_count+=1;
image_file = new File(imagesFolder,image_name);
}
image_path = imagesFolder+image_name;
Uri uriSavedImage = Uri.fromFile(image_file);
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
int request_code = 100;
startActivityForResult(imageIntent, request_code);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
ImageView thumb = (ImageView) findViewById(R.id.thumbnail);
Bitmap bmp = BitmapFactory.decodeFile(image_path);
thumb.setImageBitmap(bmp);
Toast.makeText(this, "Image …Run Code Online (Sandbox Code Playgroud) 我有处理相机的片段.我的问题是它需要一张照片并将其显示在imageView上,就好了.
我第二次尝试拍摄一张OutOfMemory错误.任何提示如何在第一张照片后释放内存?
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
System.out.println("tesstssaffsafdfsdfsd");
switch (requestCode) {
case TAKE_PICTURE:
if (resultCode == Activity.RESULT_OK) {
getActivity().getContentResolver().notifyChange(mUri, null);
ContentResolver cr = getActivity().getContentResolver();
try {
mPhoto = android.provider.MediaStore.Images.Media.getBitmap(cr, mUri);
((ImageView)rootView.findViewById(R.id.snap)).setImageBitmap(mPhoto);
} catch (Exception e) {
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪:
08-21 16:33:27.450: E/AndroidRuntime(1840): FATAL EXCEPTION: main
08-21 16:33:27.450: E/AndroidRuntime(1840): java.lang.OutOfMemoryError
08-21 16:33:27.450: E/AndroidRuntime(1840): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
08-21 16:33:27.450: E/AndroidRuntime(1840): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
08-21 16:33:27.450: E/AndroidRuntime(1840): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:722)
08-21 16:33:27.450: …Run Code Online (Sandbox Code Playgroud)