2016-09-27 15 views
0

私はAndroidで素人です。アプリからサーバーにファイルをアップロードしようとしていますが、ユーザーからの許可を要求する必要がありますが、ダイアログは断片的にポップアップしません。 私はパスを得ることができますファイルパスクラスを持って、検証権限法はapiのフラグメントにアクセス許可のダイアログが表示されない

public class FilePath{ 
    private static final int REQUEST_EXTERNAL_STORAGE = 1; 
    private static String[] PERMISSIONS_STORAGE = { 
      Manifest.permission.READ_EXTERNAL_STORAGE, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE 

    }; 


    @TargetApi(Build.VERSION_CODES.KITKAT) 
    public static String getPath(final Context context, final Uri uri) { 




     // check here to KITKAT or new version 
     final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 

     // DocumentProvider 
     if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 

      // ExternalStorageProvider 
      if (isExternalStorageDocument(uri)) { 
       final String docId = DocumentsContract.getDocumentId(uri); 
       final String[] split = docId.split(":"); 
       final String type = split[0]; 

       if ("primary".equalsIgnoreCase(type)) { 
        return Environment.getExternalStorageDirectory() + "/" 
          + split[1]; 
       } 
      } 
      // DownloadsProvider 
      else if (isDownloadsDocument(uri)) { 

       final String id = DocumentsContract.getDocumentId(uri); 
       final Uri contentUri = ContentUris.withAppendedId(
         Uri.parse("content://downloads/public_downloads"), 
         Long.valueOf(id)); 

       return getDataColumn(context, contentUri, null, null); 
      } 
      // MediaProvider 
      else if (isMediaDocument(uri)) { 
       final String docId = DocumentsContract.getDocumentId(uri); 
       final String[] split = docId.split(":"); 
       final String type = split[0]; 

       Uri contentUri = null; 
       if ("image".equals(type)) { 
        contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
       } else if ("video".equals(type)) { 
        contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
       } else if ("audio".equals(type)) { 
        contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
       } 

       final String selection = "_id=?"; 
       final String[] selectionArgs = new String[] { split[1] }; 

       return getDataColumn(context, contentUri, selection, 
         selectionArgs); 
      } 
     } 
     // MediaStore (and general) 
     else if ("content".equalsIgnoreCase(uri.getScheme())) { 

      // Return the remote address 
      if (isGooglePhotosUri(uri)) 
       return uri.getLastPathSegment(); 

      return getDataColumn(context, uri, null, null); 
     } 
     // File 
     else if ("file".equalsIgnoreCase(uri.getScheme())) { 
      return uri.getPath(); 
     } 

     return null; 
    } 


    public static String getDataColumn(Context context, Uri uri, 
             String selection, String[] selectionArgs) { 

     Cursor cursor = null; 
     final String column = "_data"; 
     final String[] projection = { column }; 

     try { 
      cursor = context.getContentResolver().query(uri, projection, 
        selection, selectionArgs, null); 
      if (cursor != null && cursor.moveToFirst()) { 
       final int index = cursor.getColumnIndexOrThrow(column); 
       return cursor.getString(index); 
      } 
     } finally { 
      if (cursor != null) 
       cursor.close(); 
     } 
     return null; 
    } 


    public static boolean isExternalStorageDocument(Uri uri) { 
     return "com.android.externalstorage.documents".equals(uri 
       .getAuthority()); 
    } 


    public static boolean isDownloadsDocument(Uri uri) { 
     return "com.android.providers.downloads.documents".equals(uri 
       .getAuthority()); 
    } 


    public static boolean isMediaDocument(Uri uri) { 
     return "com.android.providers.media.documents".equals(uri 
       .getAuthority()); 
    } 

    public static boolean isGooglePhotosUri(Uri uri) { 
     return "com.google.android.apps.photos.content".equals(uri 
       .getAuthority()); 
    } 

    public static void verifyStoragePermissions(Activity activity) { 
     // Check if we have write permission 
     int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 


     if (permission != PackageManager.PERMISSION_GRANTED) { 
      // We don't have permission so prompt the user 
      Log.d("Permission Checked","Checked permision!!!!!"); 
      ActivityCompat.requestPermissions(activity, 
        PERMISSIONS_STORAGE, 
        REQUEST_EXTERNAL_STORAGE 

      ); 
     } 

    } 

} 

私は、このフラグメントのクラスの権限メソッドを確認呼び出す権限ダイアログ持ち出す必要があり、このクラスでもあるのonCreate

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
// Inflate the layout for this fragment 
View v = inflater.inflate(R.layout.fragment_upload, container, false); 
ivAttachment = (ImageView) v.findViewById(R.id.ivAttachment); 
bUpload = (Button) v.findViewById(R.id.b_upload); 
tvFileName = (TextView) v.findViewById(R.id.tv_file_name); 
ivAttachment.setOnClickListener(this); 
bUpload.setOnClickListener(this); 

FilePath.verifyStoragePermissions(this.getActivity()); 


return v; 
} 

断片はMainActivityに追加さBottomBarに含まれる

public class MainActivity extends AppCompatActivity { 
    private static final int REQUEST_PERMISSION = 10; 

    BottomBar mBottomBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 





     mBottomBar = BottomBar.attach(this,savedInstanceState); 

     mBottomBar.setItemsFromMenu(R.menu.menu_main,new OnMenuTabClickListener() 

     { 


      public void onMenuTabSelected(@IdRes int i) { 
       if(i==R.id.Bottombaritemone) 
       { NewsFRagment f = new NewsFRagment(); 
        getSupportFragmentManager().beginTransaction().replace(R.id.main_container,f).commit(); 

       } 
       else if(i==R.id.Bottombaritemtwo) 
       { 
        Cardsfragment f =new Cardsfragment(); 
        getSupportFragmentManager().beginTransaction().replace(R.id.main_container,f).commit(); 
       } 
       else if(i==R.id.Bottombaritemthree) 
       { 
        PhoneFragment f =new PhoneFragment(); 
        getSupportFragmentManager().beginTransaction().replace(R.id.main_container,f).commit(); 
       } 
       else if(i==R.id.Bottombaritemfour) 
       { 
        UploadFragment f =new UploadFragment(); 
        getSupportFragmentManager().beginTransaction().replace(R.id.main_container,f).commit(); 

       } 
       else if(i==R.id.Bottombaritemfive) 
       { 
        FavoritesFragment f =new FavoritesFragment(); 
        getSupportFragmentManager().beginTransaction().replace(R.id.main_container,f).commit(); 
       } 
      } 



      @Override 
      public void onMenuTabReSelected(@IdRes int i) { 

      } 
     }); 
     mBottomBar.mapColorForTab(0, "#F44336"); 
     mBottomBar.mapColorForTab(1,"#9C27B0"); 
     mBottomBar.mapColorForTab(2,"#03A9F4"); 
     mBottomBar.mapColorForTab(3,"#795548"); 
     mBottomBar.mapColorForTab(4,"#FF6F00"); 

     BottomBarBadge unread; 
     unread = mBottomBar.makeBadgeForTabAt(3,"#FF0000",13); 
     unread.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; 
    } 

} 

私はこれをBottom Barなしでテストしましたが、アクセス許可のダイアログがポップアップしますが、なぜそれがオンになっていないのか分かりません。BottomBarフラグメント私は修正しようとしましたが、できません...助けてください!

+0

ここに、許可を求めるコードと、「決して尋ねないでください」と「拒否する」とを説明するコードがあります。https://androidexampleblog.wordpress.com/2016/06/14/androids-runtime-permission-example/ –

+0

コードを使用しようとするとアクセス許可が拒否されてからダイアログがポップアップされ、許可を求めるメッセージが表示されます –

+0

マニフェストに必要なアクセス権がありますか? –

答えて

0

ユーザーがアクセス許可を拒否した場合、アクセス許可ダイアログは表示されません。 2回目の起動時に、ユーザーは、今後このアプリケーションの許可を求めるのを防ぐため、「もう一度やり直しない」オプションが表示されます。

しかし、ユーザーが何かをしても、やりとりするものがないと、UXの言葉はかなり悪いです。この場合も同様に処理する必要があります。 requestPermissionsを呼び出す前に、アクティビティのshouldShowRequestPermissionRationaleによって要求されているアクセス許可がアプリケーションに必要な理由についての根拠ダイアログを確認する必要があります

このアクセス権が初めて要求されたときに表示され、ユーザーがそのアクセス権をマークしたことがない場合は、もう一度お問い合わせください。後者の場合、権限付与ダイアログなしでPERMISSION_DENIEDを指定してonRequestPermissionsResultが呼び出されます。

私は実行時のアクセス許可を求めるために小さいgist on githubを書いています。

また、実行時のアクセス許可の詳細については、blogを確認してください。

+0

物事は許可されていないダイアログは全くポップアップしないので、ユーザーが受け入れるか拒否するオプションがないので、 –

+0

私はすべてのエラーを処理する私のプロジェクトで実装するための新しいコードを手に入れました。問題は今すぐ許可のポップを要求するダイアログの前に許可が拒否されています、許可または拒否するオプションはありませんが、onRequestPermissionsResultこの –

+0

決して心が素晴らしい作品 –