SharedPreferences提供某些设备上的默认值

时间:2018-09-04 12:57:36

标签: java android sharedpreferences

我正在使用此代码将键值对保存在共享首选项中,并且可以在我的设备上正常工作,但是在模拟器和其他实际设备上,它总是返回默认值。

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

public static final String USER_PREFS = "com.aamir.friendlocator.friendlocator.USER_PREFERENCE_FILE_KEY";
SharedPreferences sharedPreferences;

private static String userKey="";

GoogleApiClient mGoogleApiClient;
Location mLastLocation;

static final int PERMISSION_ACCESS_FINE_LOCATION = 1;
boolean FINE_LOCATION_PERMISSION_GRANTED = false;



TextView textViewLocationData;
TextView textViewKeyDisplay;
Button buttonRefresh;
Button btnCopyKey;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            goToActivityFriends();
        }
    });
    fab.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_people_white_48dp));
    textViewLocationData = (TextView) findViewById(R.id.textViewLocationData);
     textViewKeyDisplay =(TextView) findViewById(R.id.tvKeyDisplay);
    buttonRefresh = (Button) findViewById(R.id.buttonRefresh);
    btnCopyKey = (Button) findViewById(R.id.btnCopyKey);
    sharedPreferences = getApplicationContext().getSharedPreferences(USER_PREFS, Context.MODE_PRIVATE);
    String key = sharedPreferences.getString("key", "");
    if(!key.equals("")) {
        textViewKeyDisplay.setText(key);
    }
    // Create an instance of GoogleAPIClient.
    buildGoogleApiClient();

    //user_sp = getSharedPreferences(USER_PREFS, 0);

    buttonRefresh.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            displayLocation();
        }
    });

    btnCopyKey.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            ClipData clip = ClipData.newPlainText("userKey", textViewKeyDisplay.getText().toString());
            clipboard.setPrimaryClip(clip);
            Toast.makeText(getBaseContext(), "Key copied !", Toast.LENGTH_SHORT).show();
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
protected void onStart() {
    super.onStart();
    if (mGoogleApiClient != null) mGoogleApiClient.connect();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

protected synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API).build();
}

private void displayLocation() {

    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
    if ( permissionCheck != PackageManager.PERMISSION_GRANTED)
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSION_ACCESS_FINE_LOCATION);

    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

    if (mLastLocation != null) {
        double latitude = mLastLocation.getLatitude();
        double longitude = mLastLocation.getLongitude();

        textViewLocationData.setText(latitude + ", " + longitude);
        sharedPreferences = getApplicationContext().getSharedPreferences(USER_PREFS, Context.MODE_PRIVATE);
        String key = sharedPreferences.getString("key", "");
        Log.d("User Key",key);
        updateServers(latitude, longitude,key);

    } else {
        textViewLocationData
                .setText("Couldn't get the location. Make sure location is enabled on the device");
    }
}
@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_ACCESS_FINE_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                FINE_LOCATION_PERMISSION_GRANTED = true;
                //displayLocation();
            } else {
                FINE_LOCATION_PERMISSION_GRANTED = false;
            }
            return;
        }
    }
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    Log.i("", "Connection failed: ConnectionResult.getErrorCode() = "
            + result.getErrorCode());
}

@Override
public void onConnected(Bundle arg0) {

    // Once connected with google api, get the location
    //displayLocation();
}

@Override
public void onConnectionSuspended(int arg0) {
    mGoogleApiClient.connect();
}

public void goToActivityFriends () {
    Intent intent = new Intent(this, com.aamir.friendlocator.friendlocator.Friends.class);
    startActivity(intent);
}

public void updateServers(Double lat,Double lon,String Key) {
    if (Key.equals("")) {
        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl("")
                .addConverterFactory(GsonConverterFactory.create());
        Retrofit retrofit = builder.build();
        SendLocation cleint = retrofit.create(SendLocation.class);

        Call<com.aamir.friendlocator.friendlocator.Models.SendLocation> call = cleint.registerUser(String.valueOf(lat), String.valueOf(lon), Key);

        call.enqueue(new Callback<com.aamir.friendlocator.friendlocator.Models.SendLocation>() {
            @Override
            public void onResponse(Call<com.aamir.friendlocator.friendlocator.Models.SendLocation> call, Response<com.aamir.friendlocator.friendlocator.Models.SendLocation> response) {
                Log.d("Response", response.body().getUserKey());
                if (!response.body().getUserKey().isEmpty()) {

                    String key_user = response.body().getUserKey();
                    textViewKeyDisplay.setText(key_user);

                    // Writing data to SharedPreferences
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString("key", userKey);
                    if(editor.commit()){
                        Log.d("saved","saved");
                    }



                }

            }

            @Override
            public void onFailure(Call<com.aamir.friendlocator.friendlocator.Models.SendLocation> call, Throwable t) {
                Log.e("Response", t.toString());
            }
        });


    }
    else {
        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl("http://demoanalysis.com/pro03/FriendLocator/")
                .addConverterFactory(GsonConverterFactory.create());
        Retrofit retrofit = builder.build();
        SendLocation cleint = retrofit.create(SendLocation.class);

        Call<com.aamir.friendlocator.friendlocator.Models.SendLocation> call = cleint.updateLocation(String.valueOf(lat), String.valueOf(lon), Key);

        call.enqueue(new Callback<com.aamir.friendlocator.friendlocator.Models.SendLocation>() {
            @Override
            public void onResponse(Call<com.aamir.friendlocator.friendlocator.Models.SendLocation> call, Response<com.aamir.friendlocator.friendlocator.Models.SendLocation> response) {
                Log.d("Response", response.body().getLocationStatus());
                if (!response.body().getLocationStatus().isEmpty()) {
                    Toast.makeText(MainActivity.this,response.body().getLocationStatus(),Toast.LENGTH_LONG).show();

                }

            }

            @Override
            public void onFailure(Call<com.aamir.friendlocator.friendlocator.Models.SendLocation> call, Throwable t) {
                Log.e("Response", t.toString());
            }
        });

    }


}

}

在某些设备上,它运行良好。我确实将上下文从此更改为getApplicationContext,但是没有任何进展。我已经更新了代码。

2 个答案:

答案 0 :(得分:2)

编辑:

tl; dr :您在首选项中写入了错误的变量。

您的变量userKey不会被写入,并且始终是一个空字符串。 在改造onResponse中,您将userKey作为“ key”的值放入了 优先。这会将空字符串写入首选项。这将起作用,并且不会给您任何错误。

请为userKey赋值key_user。 您的回复仅存储到key_user

或直接删除本地变量key_user,如下所示:

public void onResponse(Call<com.aamir.friendlocator.friendlocator.Models.SendLocation> call, Response<com.aamir.friendlocator.friendlocator.Models.SendLocation> response) {
                Log.d("Response", response.body().getUserKey());
                if (!response.body().getUserKey().isEmpty()) {

                    String userKey = response.body().getUserKey();
                    textViewKeyDisplay.setText(userKey);

                    // Writing data to SharedPreferences
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString("key", userKey);
                    if(editor.commit()){
                        Log.d("saved","saved");
                    }
                }  
            }

之前:

在要保存的代码中,您直接尝试使用editor.apply();

来收集以前保存的值。

根据文档说明,apply将在后台将您的更改保存在其他线程上。

因此,当您尝试获取该值时,您的更改可能不会保存, 下面几行。

尝试改用editor.commit();,然后检查问题是否仍然存在。

答案 1 :(得分:0)

我在这里分享我自己的首选项类,这太简单了,因此您可以放入任何项目。

将此类放入您的util文件夹或任何位置。

AppPreference.java

package util;

import android.content.Context;
import android.content.SharedPreferences;

/**
 * Created by Pranav on 25/06/16.
 */
public class AppPreference {

    public static final String PREF_IS_LOGIN = "prefIsLogin";

        public static final class PREF_KEY {
        public static final String LOGIN_STATUS = "loginstatus";
    }

    public static final void setStringPref(Context context, String prefKey, String key, String value) {
        SharedPreferences sp = context.getSharedPreferences(prefKey, 0);
        SharedPreferences.Editor edit = sp.edit();
        edit.putString(key, value);
        edit.commit();
    }

    public static final String getStringPref(Context context, String prefName, String key) {
        SharedPreferences sp = context.getSharedPreferences(prefName, 0);
        return sp.getString(key, "");
    }

}

当用户登录设置值时,在Login.java中设置首选项值:

 AppPreference.setStringPref(context, AppPreference.PREF_IS_LOGIN, AppPreference.PREF_KEY.LOGIN_STATUS, "0");

然后您将通过以下调用获得任何类中的登录状态值:

 String LoginStatus = AppPreference.getStringPref(context, AppPreference.PREF_IS_LOGIN, AppPreference.PREF_KEY.LOGIN_STATUS);