2017-02-23 5 views
0

enthält. Grundlegende App erstellen und IllegalArgumentException abrufen: Hatte eine Schaltfläche, um die Kamera-App zu starten, in der ich Bilder in Bildern speichern möchte . dispatchTakePictureIntent(); Methode wird aufgerufen, wenn ich Schaltfläche Bildjava.lang.IllegalArgumentException: Fehler beim Suchen des konfigurierten Stammverzeichnisses, das/storage/emulated/0/Android/data/

gefunden paar ähnliche Fragen klicken, aber das könnte mein Problem nicht beheben:

Unten ist mein Code. Kann jemand helfen, was ich vermisse?

public class CatalogDataActivity extends AppCompatActivity { 

    static final int REQUEST_IMAGE_CAPTURE = 1; 
    public String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/CatalogData"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //verifyStoragePermissions(); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_catalog_data); 
     final Button btCamera=(Button)findViewById(R.id.btn_camera); 
     final Button btSave=(Button)findViewById(R.id.btn_save); 

     final EditText etProductName=(EditText)findViewById(R.id.et_productName); 
     final EditText etProductDescription=(EditText)findViewById(R.id.et_description); 
     final TextView finalText=(TextView)findViewById(R.id.tv_saved_text); 
     File dir=new File(path); 
     if(!dir.isDirectory()){ 
      dir.mkdir(); 
     } 
     btCamera.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       /* Intent takePictureIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       if(takePictureIntent.resolveActivity(getPackageManager())!=null){ 
        startActivityForResult(takePictureIntent,REQUEST_IMAGE_CAPTURE); 
       }*/ 
       dispatchTakePictureIntent(); 
      } 
     }); 
     btSave.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String newProductDataStr=etProductName.getText()+","+etProductDescription.getText()+"|"; 
       File file=new File(path+"/catalogdata.txt"); 
       System.out.println("Path:"+path); 
       writeToFile(newProductDataStr,getApplicationContext()); 
       String data=readFromFile(getApplicationContext()); 
       finalText.setText(data); 
       //finalText. 
       String []splitData=data.split("|"); 

       //System.out.println(">>>>>>>>>>>>>>>>>>>>////"+splitData.length+"/////>>>>>>>>>>>>>>>>>>"+splitData[splitData.length-4]); 
      } 
     }); 

    } 

    private void writeToFile(String data,Context context) { 
     try { 
      OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("config1.txt", Context.MODE_APPEND)); 
      outputStreamWriter.write(data); 
      outputStreamWriter.close(); 
     } 
     catch (IOException e) { 
      System.out.println("Exception"+ "File write failed: " + e.toString()); 
     } 
    } 

    private String readFromFile(Context context) { 

     String ret = ""; 

     try { 
      InputStream inputStream = context.openFileInput("config1.txt"); 

      if (inputStream != null) { 
       InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
       BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
       String receiveString = ""; 
       StringBuilder stringBuilder = new StringBuilder(); 

       while ((receiveString = bufferedReader.readLine()) != null) { 
        stringBuilder.append(receiveString); 
       } 

       inputStream.close(); 
       ret = stringBuilder.toString(); 
      } 
     } 
     catch (FileNotFoundException e) { 
      Log.e("login activity", "File not found: " + e.toString()); 
     } catch (IOException e) { 
      Log.e("login activity", "Can not read file: " + e.toString()); 
     } 

     return ret; 
    } 

    @Override 
    public void onActivityResult(int requestCode,int resultCode,Intent data){ 
     if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
      Bundle extras = data.getExtras(); 
      Bitmap bitMap = (Bitmap) extras.get("data"); 
      String ImagePath = MediaStore.Images.Media.insertImage(
        getContentResolver(), 
        bitMap, 
        "demo_image", 
        "demo_image" 
      ); 
      System.out.println("Saved Image in :"+ImagePath); 
     } 
    } 

    String mCurrentPhotoPath; 

    private File createImageFile() throws IOException { 
     // Create an image file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "JPEG_" + timeStamp + "_"; 
     File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
     if(!storageDir.isDirectory()){ 
      storageDir.mkdir(); 
     } 
     File image = File.createTempFile(
       imageFileName, /* prefix */ 
       ".jpg",   /* suffix */ 
       storageDir  /* directory */ 
     ); 

     // Save a file: path for use with ACTION_VIEW intents 
     mCurrentPhotoPath = image.getAbsolutePath(); 
     return image; 
    } 
    static final int REQUEST_TAKE_PHOTO = 1; 

    private void dispatchTakePictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     // Ensure that there's a camera activity to handle the intent 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 

      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       try { 
        Uri photoURI = FileProvider.getUriForFile(this, 
          "com.example.android.fileprovider", 
          photoFile); 
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
        startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
       }catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
      //galleryAddPic(); 
     } 
    } 
    private void galleryAddPic() { 
     Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     File f = new File(mCurrentPhotoPath); 
     Uri contentUri = Uri.fromFile(f); 
     mediaScanIntent.setData(contentUri); 
     this.sendBroadcast(mediaScanIntent); 
    } 

} 

manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.androidapp.natty.catalogcreate"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".CatalogDataActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
    <uses-feature android:name="android.hardware.camera" 
     android:required="true" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
     android:maxSdkVersion="18" /> 
    <provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="com.example.android.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/file_paths"></meta-data> 
    </provider> 
</manifest> 

file_paths.xml at res platziert/xml/file_paths.xml

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="my_images" path="com.androidapp.natty.catalogcreate/files/Pictures" /> 
</paths>  

activity_catalog_data.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_catalog_data" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.androidapp.natty.catalogcreate.CatalogDataActivity"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!" 
     android:id="@+id/textView" /> 

    <Button 
     android:text="Open Camera" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/textView" 
     android:layout_marginTop="10dp" 
     android:id="@+id/btn_camera" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:elevation="0dp" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="textPersonName" 
     android:text="Product Name" 
     android:ems="10" 
     android:layout_below="@+id/btn_camera" 
     android:layout_marginTop="50dp" 
     android:id="@+id/et_productName" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="textMultiLine" 
     android:ems="10" 
     android:id="@+id/et_description" 
     android:text="Enter Description" 
     android:layout_below="@+id/et_productName" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:srcCompat="@android:drawable/ic_menu_add" 
     android:layout_marginTop="28dp" 
     android:id="@+id/iv_image1" 
     android:layout_below="@+id/et_description" /> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:srcCompat="@android:drawable/ic_menu_add" 
     android:layout_alignTop="@+id/iv_image1" 
     android:layout_toRightOf="@+id/textView" 
     android:layout_toEndOf="@+id/textView" 
     android:id="@+id/iv_image2" /> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     app:srcCompat="@android:drawable/ic_menu_add" 
     android:layout_marginLeft="41dp" 
     android:layout_marginStart="41dp" 
     android:id="@+id/iv_image3" 
     android:layout_alignTop="@+id/iv_image2" 
     android:layout_toRightOf="@+id/iv_image2" 
     android:layout_toEndOf="@+id/iv_image2" /> 

    <Button 
     android:text="Save Product" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/iv_image2" 
     android:layout_marginTop="18dp" 
     android:id="@+id/btn_save" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/btn_save" 
     android:layout_marginTop="56dp" 
     android:text="Hello World!" 
     android:id="@+id/tv_saved_text" /> 

</RelativeLayout> 

> W/System.err: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.androidapp.natty.catalogcreate/files/Pictures/JPEG_20170222_233359_1077283085.jpg 
W/System.err:  at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711) 
W/System.err:  at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400) 
W/System.err:  at com.androidapp.natty.catalogcreate.CatalogDataActivity.dispatchTakePictureIntent(CatalogDataActivity.java:176) 
W/System.err:  at com.androidapp.natty.catalogcreate.CatalogDataActivity.access$000(CatalogDataActivity.java:33) 
W/System.err:  at com.androidapp.natty.catalogcreate.CatalogDataActivity$1.onClick(CatalogDataActivity.java:61) 
W/System.err:  at android.view.View.performClick(View.java:5612) 
W/System.err:  at android.view.View$PerformClick.run(View.java:22285) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:751) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:154) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6123) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
I/Choreographer: Skipped 2537 frames! The application may be doing too much work on its main thread. 
I/art: Do full code cache collection, code=101KB, data=124KB 
I/art: After code cache collection, code=64KB, data=67KB 
+0

Verwenden 6.0 taget sdk? –

+0

Minimum sdk 4 und ich habe es getestet in 7.0 –

+0

Sie benötigen Laufzeit Erlaubnis geben, die ich unten geben Antwort –

Antwort

0

Verwendung wie folgt aus:

private static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1; 
public static final int MEDIA_TYPE_IMAGE = 1; 
private Uri fileUri; 
int isCamera = 1; 



    if (options[item].equals("Camera")) { 
     isCamera = 1; 
     if (checkandRequestPermission()) { 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
       intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
       fileUri = FileProvider.getUriForFile(EditProfile.this, getPackageName()+ ".provider", getOutputMediaFile(MEDIA_TYPE_IMAGE)); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
      } else { 
         fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
         intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
      } 
      startActivityForResult(intent, 1); 
      } 
     } else if (options[item].equals("Choose from Gallery")) { 
       isCamera = 0; 
       if (checkandRequestPermission()) { 
       Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(intent, 2); 
     } 
} 


private boolean checkandRequestPermission() { 
     int camera = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); 
     int storageread = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); 
     int storagewrite = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

     List<String> listpermissionNeeded = new ArrayList<>(); 

     if (camera != PackageManager.PERMISSION_GRANTED) { 
      listpermissionNeeded.add(Manifest.permission.CAMERA); 
     } 
     if (storageread != PackageManager.PERMISSION_GRANTED) { 
      listpermissionNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE); 
     } 
     if (storagewrite != PackageManager.PERMISSION_GRANTED) { 
      listpermissionNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     } 
     if (!listpermissionNeeded.isEmpty()) { 
      ActivityCompat.requestPermissions(EditProfile.this, listpermissionNeeded.toArray(new String[listpermissionNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS); 
      return false; 
     } 
     return true; 
    } 

und auch onRequestPermission Ergebnis hinzufügen.

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_ID_MULTIPLE_PERMISSIONS: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        // permission was granted, yay! Do the 
        // task you need to do. 
        if ((ContextCompat.checkSelfPermission(this, 
         Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) 
         && (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) 
         && (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) { 
         if (isCamera == 1) { 
          Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
           intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
           fileUri = FileProvider.getUriForFile(EditProfile.this, getPackageName()+ ".provider", getOutputMediaFile(MEDIA_TYPE_IMAGE)); 
           intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
          } else { 
           fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
           intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
          } 
          startActivityForResult(intent, 1); 
         } else { 
          Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
          startActivityForResult(intent, 2); 
         } 
        } 

       } else { 
        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
       } 
       return; 
      } 
     } 
    } 
0
public void getGROUPSTORAGEPremission(){ 
     int hasWriteContactsPermission = Splash_activity.this.checkSelfPermission(Manifest.permission_group.STORAGE); 
     if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { 
      Splash_activity.this.requestPermissions(new String[]{ Manifest.permission_group.STORAGE}, 
        PERMISSION_GROUPSTORAGE); 
     } else { 

      //your code here 
     } 

    } 


@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     if (requestCode == PERMISSION_RECEIVESMS) { 
      if (grantResults[0] == PackageManager.PERMISSION_GROUPSTORAGE) { 
       //your code here 
      } else { 
       // Permission Denied 
//    Toast.makeText(mContext, "STORAGE Denied", Toast.LENGTH_SHORT) 
//      .show(); 
      } 
     } 
0

ich dieses Problem gelöst durch

<uses-feature android:name="android.hardware.camera" 
     android:required="true" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
     android:maxSdkVersion="18" /> 
    <provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="com.example.android.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/file_paths"></meta-data> 
    </provider> 

Code auf Anwendungsebene in Manifest-Datei zu bewegen.

3

Sie können nicht direkt auf das Verzeichnis com.androidapp.natty.catalogcreate/files/Bilder im Stammverzeichnis/storage/emulated/0/(externer Pfad) zugreifen. Sie müssen den vollständigen Pfad angeben. 'Android/Daten/com.androidapp.natty .catalogcreate/Dateien/Bilder'.

Sie können auch external-files-path verwenden (entspricht dem Verzeichnis "/storage/emulated/0/com.androidapp.natty.catalogcreate/files/") und dann das Verzeichnis "Pictures" angeben. Code unten dargestellt:

<?xml version="1.0" encoding="utf-8"?> 
    <paths xmlns:android="http://schemas.android.com/apk/res/android"> 
     <external-path name="my_images" path="Android/data/com.androidapp.natty.catalogcreate/files/Pictures" /> 
    </paths> 

oder:

<?xml version="1.0" encoding="utf-8"?> 
    <paths xmlns:android="http://schemas.android.com/apk/res/android"> 
     <external-files-path name="my_images" path="" /> 
    </paths> 

oder:

<?xml version="1.0" encoding="utf-8"?> 
    <paths xmlns:android="http://schemas.android.com/apk/res/android"> 
     <external-files-path name="my_images" path="Pictures" /> 
    </paths> 
+0

Einige Worte der Erklärung sind in der Regel geschätzt auf Stapelüberlauf. – mkl

+1

Ich bin nicht gut in Englisch, und es ist das erste Mal, dass ich einen Kommentar zum Stapelüberlauf gemacht habe. Ich hoffe du verstehst wovon ich spreche. – DavidChen

+0

Danke !!! Der zweite hat für mich funktioniert! – Yashovardhan

Verwandte Themen