安装失败,并显示错误消息:android.os.ParcelableException:java.io.IOException:仅内部请求,但没有足够的空间

时间:2019-01-31 13:04:36

标签: java android android-studio apk build.gradle

我收到消息

> 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.

我尝试过重建,清理项目,禁用和启用Instant Run以及构建APK,但没有任何方法可以解决问题。

这是我的build.gradle(Module: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(Project)

// 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);
            }
        }
    }

9 个答案:

答案 0 :(得分:3)

如果您正在使用手机,则会由于存储空间不足而出现此错误。 腾出一些空间,然后再试一次。

答案 1 :(得分:1)

问题在于正在运行的设备上的存储空间。尝试安装清除空间或将其安装在模拟器上。

答案 2 :(得分:1)

这只是虚拟设备空间不足。每次运行应用程序时,虚拟设备上的每次安装都会占用一些空间。随着时间的推移,空间会填满,直到全部用完。您可以按照一些答案的建议增加空间 - 最初会起作用,但最终该空间也会用完。

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

enter image description here

转到 AVD 管理器,在您设备的操作中有“擦除数据”选项 - 这样做。

enter image description here

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

enter image description here

答案 3 :(得分:0)

该文件系统没有空间:

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

问题是:

android:installLocation="internalOnly"

将其删除,或替换为:

android:installLocation="preferExternal"

或者甚至通过卸载或删除某些内容在设备/仿真器上留出空间。

答案 4 :(得分:0)

我将AVD Manager的SD卡更改为1000MB,它可以正常工作

答案 5 :(得分:0)

在Android Studio中,打开AVD管理器并编辑有问题的模拟器。在编辑屏幕中,您可能需要单击“显示高级设置”。向下滚动并增加内部存储器和SD卡存储器。完成此操作后,我可以再次安装我的应用程序。

答案 6 :(得分:0)

将此行放在app/build.gradle内:

 defaultConfig {
    ... 
    android:installLocation="auto"
    ....
 }

答案 7 :(得分:0)

我卸载了所有运行的应用程序,并将其安装在虚拟设备上,错误消失了。

答案 8 :(得分:0)

您的应用正在尝试安装在虚拟设备的内部空间上,并且空间不足。如果您运行仿真器,请转到config / storage,您会发现没有空间。

有时候,模拟器是使用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进行了出色的集成,因此您需要100%手动进行此操作,此外,在发生错误时您不会收到任何信息或说明,因此修复它确实很烦人: (对于99%的Xamarin问题,情况总是一样!