2016-07-28 17 views
0

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) { 

    } 
} 

Antwort

1
public boolean ifPermissionReady(){ 

     if (ContextCompat.checkSelfPermission(getActivity(), 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ 
      System.out.println("req write storage permission*****"); 
      checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, Constant.PERMISSION_WRITE_EXTERNAL_STORAGE); 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
     System.out.println("onRequestPermissionsResult******"); 

     //onStateNotSaved(); 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     switch (requestCode) { 

      case Constant.PERMISSION_WRITE_EXTERNAL_STORAGE:{ 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        //Do something 
       } else { 
        System.out.println("---> permission denied"); 
        //Do something 
       } 
      } 

     } 
    } 

Marshmallow erfordern Entwickler, die Berechtigung während der Laufzeit zu erwerben. Probieren Sie den obigen Code aus.

+0

Vielen Dank für Ihre schnelle Antwort .. können Sie mir bitte sagen, wo ich diesen Code (ich meine welche Klasse, unter welcher Zeile) –

+0

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

+0

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

Verwandte Themen