2015-08-26 4 views
13

मैं चित्रों को बचाने के लिए निर्देशिका बनाने के लिए इस कोड है:एंड्रॉयड 6 (एम) की अनुमति मुद्दा (निर्देशिका बनाने से काम नहीं कर)

 File storageDir = null; 
     if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {     
      storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myphoto"); 
      if (!storageDir.mkdirs()) {      
       if (!storageDir.exists()){      
        Log.d("photo", "failed to create directory"); 
        return null; 
       } 
      } 
     } 
     return storageDir; 

storeDir रिटर्न एंड्रॉयड 6 नीचे "/storage/emulated/0/Pictures/myphoto/" और एंड्रॉयड 6 यह रिटर्न null पर।

मैं अनुमति <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

buildToolVersion 23 targetSdkVersion 23

कैसे तय करने के लिए है?

+0

"storeDir रिटर्न" file: /// भंडारण/नकल करते/0/चित्र/MyPhoto/फ़ाइल "एंड्रॉयड 6 और एंड्रॉयड 6 पर यह रिटर्न नीचे": /// "" - कि कोड लौटा रहा है ' फाइल 'ऑब्जेक्ट्स, स्ट्रिंग्स नहीं। इसके अलावा, आपका 'targetSdkVersion' क्या है? – CommonsWare

+0

संपादित प्रश्न –

+0

यह वास्तव में –

उत्तर

21

रूप @CommonsWare उत्तर दिया, वहाँ है रन-टाइम अनुमति पर एंड्रॉयड एम अवधारणा पूछ, इसलिए नए दृष्टिकोण में, जब स्थापित करने अनुमतियाँ पूछा नहीं कर रहे हैं ऐप लेकिन फोन की विशिष्ट सुविधा का उपयोग करने का प्रयास करते समय, जो रन-टाइम पर अनुमति का अनुरोध करता है। बाद में उपयोगकर्ता phone settings->app->yourapp->permissions से भी अनुमति अक्षम कर सकता है। आप की तरह इस काम के लिए अनुमति प्राप्त करना होगा

int REQUEST_WRITE_EXTERNAL_STORAGE=1; 
////... 
     File storageDir = null; 
     if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { 
      //RUNTIME PERMISSION Android M 
      if(PackageManager.PERMISSION_GRANTED==ActivityCompat.checkSelfPermission(context,Manifest.permission.WRITE_EXTERNAL_STORAGE)){ 
       storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myPhoto"); 
      }else{ 
       requestPermission(context); 
      }  

     } 
     return storageDir; 
////... 
     private static void requestPermission(final Context context){ 
     if(ActivityCompat.shouldShowRequestPermissionRationale((Activity)context,Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
      // Provide an additional rationale to the user if the permission was not granted 
      // and the user would benefit from additional context for the use of the permission. 
      // For example if the user has previously denied the permission. 

      new AlertDialog.Builder(context) 
        .setMessage(context.getResources().getString(R.string.permission_storage)) 
        .setPositiveButton(R.string.tamam, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        ActivityCompat.requestPermissions((Activity) context, 
          new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
          REQUEST_WRITE_EXTERNAL_STORAGE); 
       } 
      }).show(); 

     }else { 
      // permission has not been granted yet. Request it directly. 
      ActivityCompat.requestPermissions((Activity)context, 
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        REQUEST_WRITE_EXTERNAL_STORAGE); 
     } 
    } 

///... 

    @Override 
    public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case UtilityPhotoController.REQUEST_WRITE_EXTERNAL_STORAGE: { 
       if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        Toast.makeText(context, 
          getResources().getString(R.string.permission_storage_success), 
          Toast.LENGTH_SHORT).show(); 

       } else { 
        Toast.makeText(context, 
          getResources().getString(R.string.permission_storage_failure), 
          Toast.LENGTH_SHORT).show(); 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
       } 
       return; 
      } 
     } 
    } 
+0

मैंने एमुलेटर में परीक्षण किया है, अगर आप रनटाइम अनुमति देते हैं, तो प्रक्रिया को मारने और फिर से शुरू करने की आवश्यकता है? –

+0

@ParaSara कोई आप –

+0

की जरूरत नहीं है मैं के रूप में ही इस मुद्दे का सामना करना पड़ा: http://stackoverflow.com/questions/32947638/requesting-and-allowing-write-external-storage-permission-at-runtime-has-no- प्रभावी तरीके –

16

आप किसी Android 6.0+ पर्यावरण पर इस चल रहे हैं और आप में से एक targetSdkVersion 23.

उस मामले में, WRITE_EXTERNAL_STORAGEthe Android 6.0 runtime permission system का हिस्सा है। या तो यह प्रणाली में भाग लेने, या छोड़ने के लिए अपनी एप्लिकेशन को संशोधित अपने targetSdkVersion नीचे 23.

+0

शून्य देता है मैंने बिना अनुमति के इसका परीक्षण किया है, कोई भाग्य –

+0

@JemshitIskenderov: मैंने आपको अनुमति को हटाने के लिए नहीं बताया था। मैंने आपको एंड्रॉइड 6.0 रनटाइम अनुमति प्रणाली में भाग लेने के लिए अपने ऐप को संशोधित करने के लिए कहा है, या 23 से नीचे अपना 'targetSdkVersion' ड्रॉप करने के लिए कहा है। – CommonsWare

+0

"एंड्रॉइड 6.0 रनटाइम अनुमति प्रणाली में भाग लेने के लिए अपने ऐप को संशोधित करें" का क्या मतलब है? –

4

:

enter image description here

इस कोड impliment करते के लिए: तो आपको लगता है कि अनुमति के साथ कुछ करने से पहले जाँच करने के लिए, और उपयोगकर्ता पूछना

if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 

     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 

     } else { 


      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},23 
        ); 
     } 
    } 

शुभकामनाएं !!!

0

इस कोड को आज़माएं।

@Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
          if (checkPermission()) { 
           //do your work 
          } else { 
           requestPermission(); 
          } 
         } 
       } 


       protected boolean checkPermission() { 
        int result = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
        if (result == PackageManager.PERMISSION_GRANTED) { 
         return true; 
        } else { 
         return false; 
        } 
       } 

       protected void requestPermission() { 

        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
         Toast.makeText(this, "Write External Storage permission allows us to do store images. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show(); 
        } else { 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
          requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); 
         } 
        } 
       } 

      @Override 
      public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
       switch (requestCode) { 
        case 100: 
         if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
          //do your work 
         } else { 
          Log.e("value", "Permission Denied, You cannot use local drive ."); 
         } 
         break; 
       } 
      } 
+0

पहले से ही समाधान के साथ हल किया गया –

संबंधित मुद्दे