Auch nach dem Hinzufügen Speichererlaubnis zu meiner App kann ich nicht festlegen, Hintergrundbild oder Download (eine Funktion meiner App) Es ist wie Hintergrund Einstellung App. und kann das Wallpaper nicht teilen.Speichererlaubnis Problem für meine Tapete App in android Marshmallow
Hier ist mein Code, den ich gemacht habe.
Bitte sehen Sie sich meinen Code an und sagen Sie mir, was damit nicht stimmt.
Wenn es irgendeine Lösung plz erklären mir klar Schritt-für-Schritt (Ich bin neu in android)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.saveitornot.wallit" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<permission android:name="com.saveitornot.wallit.C2D_MESSAGE" android:protectionLevel="signature"/>
<uses-permission android:name="com.saveitornot.wallit.permission.C2D_MESSAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
<application
android:name=".app.AppController"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".SplashActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
android:name=".FullScreenViewActivity"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".SettingsActivity"
android:label="@string/action_settings"
android:screenOrientation="portrait" >
</activity>
</application>
</manifest>
FullscreenViewActivity.java
package com.saveitornot.wallit;
import android.annotation.SuppressLint;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.JsonObjectRequest;
import com.saveitornot.wallit.app.AppController;
import com.saveitornot.wallit.picasa.model.Wallpaper;
import com.saveitornot.wallit.utils.Utils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class FullScreenViewActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = FullScreenViewActivity.class
.getSimpleName();
public static final String TAG_SEL_IMAGE = "selectedImage";
private Wallpaper selectedPhoto;
private ImageView fullImageView;
private LinearLayout llSetWallpaper, llDownloadWallpaper;
private Utils utils;
private ProgressBar pbLoader;
private CoordinatorLayout coordinatorLayout;
private int progressStatus = 0;
private Handler handler = new Handler();
private String licencseURL,licenseeURL = null;
// Picasa JSON response node keys
private static final String TAG_ENTRY = "entry",
TAG_MEDIA_GROUP = "media$group",
TAG_MEDIA_CONTENT = "media$content", TAG_IMG_URL = "url",
TAG_IMG_WIDTH = "width", TAG_IMG_HEIGHT = "height";
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_fullscreen_image);
fullImageView = (ImageView) findViewById(R.id.imgFullscreen);
llSetWallpaper = (LinearLayout) findViewById(R.id.llSetWallpaper);
llDownloadWallpaper = (LinearLayout) findViewById(R.id.llDownloadWallpaper);
pbLoader = (ProgressBar) findViewById(R.id.pbLoader);
pbLoader.setIndeterminate(true);
pbLoader.setMax(100);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");
coordinatorLayout = (CoordinatorLayout) findViewById(R.id
.coordinatorLayout);
utils = new Utils(getApplicationContext());
// layout click listeners
llSetWallpaper.setOnClickListener(this);
llDownloadWallpaper.setOnClickListener(this);
// setting layout buttons alpha/opacity
llSetWallpaper.getBackground().setAlpha(70);
llDownloadWallpaper.getBackground().setAlpha(70);
Intent i = getIntent();
selectedPhoto = (Wallpaper) i.getSerializableExtra(TAG_SEL_IMAGE);
// check for selected photo null
if (selectedPhoto != null) {
// fetch photo full resolution image by making another json request
fetchFullResolutionImage();
} else {
Toast.makeText(getApplicationContext(),
getString(R.string.msg_unknown_error), Toast.LENGTH_SHORT)
.show();
}
}
/**
* Fetching image fullresolution json
* */
private void fetchFullResolutionImage() {
String url = selectedPhoto.getPhotoJson();
// show loader before making request
pbLoader.setVisibility(View.VISIBLE);
llSetWallpaper.setVisibility(View.GONE);
llDownloadWallpaper.setVisibility(View.GONE);
getSupportActionBar().hide();
// volley's json obj request
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG,
"Image full resolution json: "
+ response.toString());
try {
// Parsing the json response
JSONObject entry = response
.getJSONObject(TAG_ENTRY);
JSONArray mediacontentArry = entry.getJSONObject(
TAG_MEDIA_GROUP).getJSONArray(
TAG_MEDIA_CONTENT);
JSONObject mediaObj = (JSONObject) mediacontentArry
.get(0);
String fullResolutionUrl = mediaObj
.getString(TAG_IMG_URL);
// image full resolution widht and height
final int width = mediaObj.getInt(TAG_IMG_WIDTH);
final int height = mediaObj.getInt(TAG_IMG_HEIGHT);
Log.d(TAG, "Full resolution image. url: "
+ fullResolutionUrl + ", w: " + width
+ ", h: " + height);
ImageLoader imageLoader = AppController
.getInstance().getImageLoader();
// We download image into ImageView instead of
// NetworkImageView to have callback methods
// Currently NetworkImageView doesn't have callback
// methods
///
progressStatus = 0;
new Thread(new Runnable() {
@Override
public void run() {
while (progressStatus<100){
progressStatus += 1;
handler.post(new Runnable() {
@Override
public void run() {
pbLoader.setProgress(progressStatus);
}
});
try {
Thread.sleep(100);
}catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}).start();
///
imageLoader.get(fullResolutionUrl,
new ImageLoader.ImageListener() {
@Override
public void onErrorResponse(
VolleyError arg0) {
Toast.makeText(
getApplicationContext(),
getString(R.string.msg_wall_fetch_error),
Toast.LENGTH_LONG).show();
}
@Override
public void onResponse(
ImageLoader.ImageContainer response,
boolean arg1) {
if (response.getBitmap() != null) {
// load bitmap into imageview
fullImageView
.setImageBitmap(response
.getBitmap());
adjustImageAspect(width, height);
// hide loader and show set &
// download buttons
pbLoader.setVisibility(View.GONE);
llSetWallpaper
.setVisibility(View.VISIBLE);
llDownloadWallpaper
.setVisibility(View.VISIBLE);
getSupportActionBar().show();
}
}
});
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
getString(R.string.msg_unknown_error),
Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Error: " + error.getMessage());
// unable to fetch wallpapers
// either google username is wrong or
// devices doesn't have internet connection
Toast.makeText(getApplicationContext(),
getString(R.string.msg_wall_fetch_error),
Toast.LENGTH_LONG).show();
}
});
// Remove the url from cache
AppController.getInstance().getRequestQueue().getCache().remove(url);
// Disable the cache for this url, so that it always fetches updated
// json
jsonObjReq.setShouldCache(false);
// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq);
}
/**
* Adjusting the image aspect ration to scroll horizontally, Image height
* will be screen height, width will be calculated respected to height
* */
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
private void adjustImageAspect(int bWidth, int bHeight) {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
if (bWidth == 0 || bHeight == 0)
return;
int sHeight = 0;
if (android.os.Build.VERSION.SDK_INT >= 13) {
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
sHeight = size.y;
} else {
Display display = getWindowManager().getDefaultDisplay();
sHeight = display.getHeight();
}
int new_width = (int) Math.floor((double) bWidth * (double) sHeight
/(double) bHeight);
params.width = new_width;
params.height = sHeight;
Log.d(TAG, "Fullscreen image new dimensions: w = " + new_width
+ ", h = " + sHeight);
fullImageView.setLayoutParams(params);
}
/**
* View click listener
* */
@Override
public void onClick(View v) {
Bitmap bitmap = ((BitmapDrawable) fullImageView.getDrawable())
.getBitmap();
switch (v.getId()) {
// button Download Wallpaper tapped
case R.id.llDownloadWallpaper:
utils.saveImageToSDCard(bitmap, coordinatorLayout);
break;
// button Set As Wallpaper tapped
case R.id.llSetWallpaper:
utils.setAsWallpaper(bitmap, coordinatorLayout);
break;
default:
break;
}
}
@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_fullscreen, menu);
return true;
}
private void gotoURL(String url)
{
Uri uri = Uri.parse(url);
Intent goToWebsite = new Intent(Intent.ACTION_VIEW, uri);
// To count with Play market backstack, After pressing back button,
// to taken back to our application, we need to add following flags to intent.
int flags = Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
if (Build.VERSION.SDK_INT >= 21)
{
flags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
}
else
{
//noinspection deprecation
flags |= Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
}
goToWebsite.addFlags(flags);
try {
startActivity(goToWebsite);
} catch (ActivityNotFoundException e) {
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
Bitmap bitmap = ((BitmapDrawable) fullImageView.getDrawable())
.getBitmap();
switch (id) {
case android.R.id.home:
finish();
return true;
case R.id.action_set_as_wallpaper:
utils.setAsWallpaper(bitmap, coordinatorLayout);
return true;
case R.id.action_download:
utils.saveImageToSDCard(bitmap, coordinatorLayout);
return true;
case R.id.action_share:
utils.shareImage(bitmap, coordinatorLayout);
return true;
case R.id.action_report:
utils.reportImage(bitmap);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
SettingsActivity .java
package com.saveitornot.wallit;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.saveitornot.wallit.app.AppController;
import com.saveitornot.wallit.utils.PrefManager;
public class SettingsActivity extends AppCompatActivity implements View.OnClickListener {
private PrefManager pref;
private TextView txtGoogleUsername, txtNoOfGridColumns, txtGalleryName;
private Button btnSave;
private Button btnClearCache;
private Button btnCacheSize;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
txtGoogleUsername = (TextView) findViewById(R.id.txtGoogleUsername);
txtNoOfGridColumns = (TextView) findViewById(R.id.txtNoOfColumns);
txtGalleryName = (TextView) findViewById(R.id.txtGalleryName);
btnSave = (Button) findViewById(R.id.btnSave);
btnClearCache = (Button) findViewById(R.id.btnClearCache);
btnCacheSize = (Button) findViewById(R.id.btnCacheSize);
pref = new PrefManager(getApplicationContext());
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle(getString(R.string.action_settings));
// Display edittext values stored in shared preferences
// Google username
txtGoogleUsername.setText(pref.getGoogleUserName());
// Number of grid columns
txtNoOfGridColumns.setText(String.valueOf(pref.getNoOfGridColumns()));
// Gallery name
txtGalleryName.setText(pref.getGalleryName());
// Save settings button click listener
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Validating the data before saving to shared preferences
// validate google username
String googleUsername = txtGoogleUsername.getText().toString()
.trim();
if (googleUsername.length() == 0) {
Toast.makeText(getApplicationContext(),
getString(R.string.toast_enter_google_username),
Toast.LENGTH_LONG).show();
return;
}
// validate number of grid columns
String no_of_columns = txtNoOfGridColumns.getText().toString()
.trim();
if (no_of_columns.length() == 0 || !isInteger(no_of_columns)) {
Toast.makeText(getApplicationContext(),
getString(R.string.toast_enter_valid_grid_columns),
Toast.LENGTH_LONG).show();
return;
}
// validate gallery name
String galleryName = txtGalleryName.getText().toString().trim();
if (galleryName.length() == 0) {
Toast.makeText(getApplicationContext(),
getString(R.string.toast_enter_gallery_name),
Toast.LENGTH_LONG).show();
return;
}
// Check for setting changes
if (!googleUsername.equalsIgnoreCase(pref.getGoogleUserName())
|| !no_of_columns.equalsIgnoreCase(String.valueOf(pref
.getNoOfGridColumns()))
|| !galleryName.equalsIgnoreCase(pref.getGalleryName())) {
// User changed the settings
// save the changes and launch SplashScreen to initialize
// the app again
pref.setGoogleUsername(googleUsername);
pref.setNoOfGridColumns(Integer.parseInt(no_of_columns));
pref.setGalleryName(galleryName);
// start the app from SplashScreen
Intent i = new Intent(SettingsActivity.this,
SplashActivity.class);
// Clear all the previous activities
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
} else {
// user not modified any values in the form
// skip saving to shared preferences
// just go back to previous activity
onBackPressed();
}
}
});
btnClearCache.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppController.getInstance().clearCache();
}
});
btnCacheSize.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppController.getInstance().getCacheSize();
}
});
}
public boolean isInteger(String input) {
try {
Integer.parseInt(input);
return true;
} catch (Exception e) {
return false;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
}
}
Vielen Dank für Ihre schnelle Antwort .. können Sie mir bitte sagen, wo ich diesen Code (ich meine welche Klasse, unter welcher Zeile) –
direkt bevor Sie die Erlaubnis verwenden müssen. z.B. wenn Sie den Benutzer auffordern, auf eine Schaltfläche zu klicken und einen Lese-/Schreibspeicher auszuführen. Wenn sie dann auf die Schaltfläche klicken, rufen Sie ifPermissionReady auf, nur die Funktion gibt true zurück, und Sie fahren mit dem Lesen/Schreiben fort. – kggoh
BTW, überprüfen Sie auch andere Berechtigungen, die Sie möglicherweise das gleiche tun müssen. Wenn nicht, kann es die gewünschte Aktion entweder nicht ausführen, wenn Sie Glück haben, oder Ihre App zum Absturz bringen. zB (Lese Kontakt oder Kamera Erlaubnis wird die App zum Absturz bringen, wenn du vorher nicht um Erlaubnis gefragt hast) – kggoh