安装失败,错误信息为:android.os.ParcelableException: java.io.IOException: 请求的是内部存储空间但空间不足。

146

我收到了这条消息

> Installation failed with message Failed to establish session.

所以,根据对该问题的一些回应,我禁用了即时运行(Instant Run),然后开始出现了

> Installation failed with message Error: android.os.ParcelableException: java.io.IOException: Requested internal only, but not enough space.

我已经尝试重新构建、清理项目、禁用和启用即时运行以及构建APK,但都无法解决问题。

这是我的build.gradle文件(模块:app)。

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.gabriel.justmeet"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 9
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    useLibrary 'org.apache.http.legacy'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.volley:volley:1.1.0'
}

这是build.gradle(项目)文件的内容。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        google()
        jcenter()
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.0'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'http://repo1.maven.org/maven2' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这个问题始于我修改了我的“RegisterActivity”,所以这可能会有所帮助。

package com.example.gabriel.paska;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Map;

public class RegisterActivity extends AppCompatActivity {
    public static final String REGISTER_URL ="http://justmeet.000webhostapp.com/php/register.php";
    public static final String KEY_USERNAME ="username";
    public static final String KEY_PASSWORD="password";
    public static final String KEY_NAME ="name";
    public static final String KEY_AGE="age";
    public static final String REGISTER_SUCCESS ="RegisterSuccess";
    public static final String SHARED_PREF_NAME="tech";
    public static final String USERNAME_SHARED_PREF="username";
    public static final String LOGGEDIN_SHARED_PREF="loggedin";
    private boolean loggedIn=false;
    EditText etAge;
    EditText etName;
    EditText etPassword;
    EditText etUsername;
    Button bRegister;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        etAge = findViewById(R.id.etAgeR);
        etName = findViewById(R.id.etNameR);
        etPassword = findViewById(R.id.etPwordR);
        etUsername = findViewById(R.id.etUsernameR);
        bRegister = findViewById(R.id.btRegister);

        bRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                register();
            }
        });
    }
        private void register() {
            final String name = etName.getText().toString().trim();
            final String password = etPassword.getText().toString().trim();
            final String username = etUsername.getText().toString().trim();
            final String age = etAge.getText().toString().trim();

            StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            if(response.trim().equalsIgnoreCase(REGISTER_SUCCESS)){

                                SharedPreferences sharedPreferences = RegisterActivity.this.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);

                                SharedPreferences.Editor editor = sharedPreferences.edit();

                                editor.putBoolean(LOGGEDIN_SHARED_PREF, true);
                                editor.putString(USERNAME_SHARED_PREF, name);

                                editor.apply();

                                Intent intent = new Intent(RegisterActivity.this, UserActivity.class);
                                startActivity(intent);
                            }else{
                                Toast.makeText(RegisterActivity.this, "Register Failed" + response.trim(), Toast.LENGTH_LONG).show();
                            }
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                        }
                    }){
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    Map<String,String> prams = new HashMap<>();
                    prams.put(KEY_USERNAME, username);
                    prams.put(KEY_PASSWORD, password);
                    prams.put(KEY_NAME, name);
                    prams.put(KEY_AGE, age);

                    return prams;
                }
            };
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            requestQueue.add(stringRequest);
        }
        @Override
        protected void onResume() {
            super.onResume();
            SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREF_NAME,Context.MODE_PRIVATE);
            loggedIn = sharedPreferences.getBoolean(LOGGEDIN_SHARED_PREF, false);
            if(loggedIn){
                Intent intent = new Intent(RegisterActivity.this, UserActivity.class);
                startActivity(intent);
            }
        }
    }

1
你的设备上还有足够的空间吗?(内存或存储)。否则,如果你正在模拟器上测试,请尝试重新创建一个... - Julien Revault d'A...
12个回答

256

本问题与模拟器中的存储有关。默认的AndroidStudio值2GB对于现代Android版本来说不足够。

输入图像描述的位置


解决方案

步骤1:关闭模拟器。

步骤2:清除模拟器。

输入图像描述的位置

步骤3:将内部存储和SD卡更改为4098MB

输入图像描述的位置

步骤4:运行模拟器。


12
仅靠第三步就可以解决我的问题! - Ranjithkumar
3
更改模拟器存储容量后,我又不得不再次清除模拟器。 - jraufeisen

46

这只是虚拟设备空间不足的问题。每次运行应用程序时,在虚拟设备上安装都会占用一定的空间。随着时间的推移,空间就会填满直到耗尽。您可以像一些答案建议的那样增加空间-这将起初奏效,但最终该空间也会被用尽。

从虚拟设备的“设置”应用中,您可以查看剩余的可用空间。在这里,您可以看到几乎整个GB都被使用了,但应用本身仅使用132MB,显然有些不对劲。

enter image description here

进入AVD管理器,在您的设备操作中,有“擦除数据”的选项 - 执行此操作。

enter image description here

回到“设置”应用程序后,您现在可以看到已释放空间,并且您的应用程序有安装的空间 - 直到下一次空间不足时,您只需重复此过程。

enter image description here


3
应将此标记为正确答案。它不仅说明了问题的根本原因,还告诉了如何解决该问题。 - Rahul Bharti

22

该文件系统没有空间:

java.io.IOException: Requested internal only, but not enough space.

问题是:

android:installLocation="internalOnly"

要么删除它,要么替换为:

android:installLocation="preferExternal"
或者通过卸载或删除某些内容来为设备/模拟器腾出空间,或者仅仅为虚拟SD卡分配更多的兆字节。

10
在尝试任何修改之前,请检查设备上剩余的空间。 - Prashant Jha
3
我将AVD管理器中的SD卡更改为1000MB,它可以正常工作。 - 1705030118
2
这是您设置installLocation的位置:https://developer.android.com/guide/topics/manifest/manifest-element.html - Jaroslav Záruba
我在测试期间删除了100MB的APK和已下载/安装在AVD上的应用程序,这个错误消失了。 - Aaron
1
看起来在新的API或设备或某些情况下,installLocation被忽略了,例如大型资产,谁知道呢,但在我的情况下它只是被忽略了。 - Renetik

8
如果您使用手机出现此错误,那么是由于存储空间不足导致的。请释放一些空间,然后再次尝试,应该可以解决问题。

7
在Android Studio中,打开AVD Manager并编辑有问题的模拟器。在编辑屏幕内,您可能需要单击“显示高级设置”。向下滚动并增加内部存储器和SD卡存储器。这样做后,我就可以重新安装我的应用程序了。

2
您的应用程序正在尝试安装到虚拟设备的内部空间,但是它没有足够的空间。如果您运行模拟器,请转到配置/存储,您会发现您没有空间。
有时,模拟器创建时具有800Mb的内部空间,并且Android Oreo(例如)占用了所有该空间,因此无法安装任何内容。
此外,即使将您的应用程序配置为“首选外部”,该应用程序仍然继续尝试安装在内部存储中,因此您无法解决该问题。
对我有效的唯一解决方案是增加模拟器的内部空间,您可以通过以下选项之一来执行此操作:
A) 转到Android SDK-> ADV Manager,找到您的模拟器,编辑首选项并增加空间,复制它或其他您想要的内容。
B) 转到具有模拟器配置的文件夹(在Windows C:/ Users / your_user / .android / avd / your_emulator),并编辑*.ini文件,您可以看到与空间,内存等相关的值,只需增加这些值并保存即可。
Visual Studio 2017与Android SDK / ADV Manager的集成非常糟糕,因此您需要完全手动进行此操作,而且当错误发生时您不会收到任何信息或指示,因此修复它真的很烦人:(而且对于99%的Xamarin问题总是如此!)

2

问题出在您设备上的存储空间。尝试清理空间或者安装到模拟器上。


1

当我在模拟器上运行时,我发现即使我增加了内部磁盘空间,它也没有起作用,仍然保持相同的大小,我不得不重新创建模拟器。


1

这意味着您想要测试应用程序或进行调试的设备没有足够的空间。因此,请清除一些内存,然后再尝试。


1

在您的手机或模拟器上创建空间,它应该可以工作。


请添加更多细节以扩展您的答案,例如工作代码或文档引用。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接