簡體   English   中英

SharedPreferences提供某些設備上的默認值

[英]SharedPreferences gives default values on some devices

我正在使用此代碼將鍵值對保存在共享首選項中,並且可以在我的設備上正常工作,但是在模擬器和其他實際設備上,它始終返回默認值。

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,但是沒有任何進展。 我已經更新了代碼。

編輯:

tl; dr :您在首選項中寫入了錯誤的變量。

您的變量userKey永遠不會被寫入,並且始終是一個空字符串。 在改造onResponse ,將userKey作為“ key”的值放入首選項中。 這會將空字符串寫入首選項。 這將起作用,並且不會給您任何錯誤。

請為key_user分配userKey的值。 您的回復僅存儲到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();來收集以前保存的值editor.apply();

如文檔所述, apply將您的更改保存在后台的其他線程中。

因此,在您嘗試獲取該值時,可能不會保存您的更改,以下幾行。

嘗試使用editor.commit(); 而是檢查問題是否仍然存在。

我在這里分享我自己的首選項類,這太簡單了,因此您可以放入任何項目。

將此類放入您的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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM