2016-05-13 36 views
0

我剛開始學習一些Android應用程序開發基礎知識,我想創建一個應用程序,點擊一個按鈕後,可以使用現有的相機應用程序拍攝並保存照片。Android-無法獲取簡單的照片應用程序

我已經按照this教程(使用Android Studio)作爲核心代碼,並且我製作了我的應用程序。順便說一句,拍攝照片後,即使它應該,它也不會將它保存到畫廊中。

我試過代碼上的不同變體,但沒有一個工作。在logcat窗口中,當運行應用程序時,當我點擊打開相機的按鈕時,我得到了這個日誌(我並不知道是否是有力的或不是)

05-13 19:25 :38.974 24578-24602/seba.fotoapp E /表面:getSlotFromBufferLocked:未知緩衝區:0xb99d9980

我運行的是Android 6.0(API23)

這裏是我的代碼:

MainActivity。 java

package seba.fotoapp; 

import android.Manifest; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 

import java.io.File; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MainActivity extends AppCompatActivity { 
// Storage Permissions 
private static final int REQUEST_EXTERNAL_STORAGE = 1; 
private static String[] PERMISSIONS_STORAGE = { 
     Manifest.permission.WRITE_EXTERNAL_STORAGE, 
     Manifest.permission.READ_EXTERNAL_STORAGE 
}; 

String mCurrentPhotoPath; 
/** 
* Checks if the app has permission to write to device storage 
* 
* If the app does not has permission then the user will be prompted to grant permissions 
* 
* @param activity 
*/ 
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 
     ActivityCompat.requestPermissions(
       activity, 
       PERMISSIONS_STORAGE, 
       REQUEST_EXTERNAL_STORAGE 
     ); 
    } 
} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
    Button take_picture = (Button) findViewById(R.id.take_picture); 
    take_picture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      dispatchTakePictureIntent(); 
     } 
    }); 
} 

@Override 
protected void onStart(){ 
    super.onStart(); 
    verifyStoragePermissions(this); 
} 

@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; 
} 

@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(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

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) { 
      // Error occurred while creating the File 
      System.out.println(ex); 
     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
        Uri.fromFile(photoFile)); 
      startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
      galleryAddPic(); 
     } 
    } 
} 

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 = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

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); 
} 

} 

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="seba.fotoapp" > 
<uses-feature android:name="android.hardware.camera" 
    android:required="true" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

回答

1

要拍攝圖像並保存它肯定的,你需要一個Android拍攝意圖(你有)。不要去dispatchTakePictureIntent(),直接運行意圖。

在您的按鈕創建(的onCreate):

Button take_picture = (Button) findViewById(R.id.take_picture); 
take_picture.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // Creates an Intent to the camera 
      Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      // ARGS: the intent, a key to access later 
      startActivityForResult(i, REQUEST_TAKE_PHOTO); 
    } 
}); 

然後使用onActivityResult方法打開相機:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == REQUEST_TAKE_PHOTO && data != null) { 
     try { 
      Bitmap selectedImg = (Bitmap) data.getExtras().get("data"); 
      Log.i("Picture from Camera", "Captured"); 

      // Create a file to write bitmap data 
      File f = new File(getApplicationContext().getCacheDir(), "image.png"); 
      f.createNewFile(); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

做任何事情無論是位圖或已創建的文件。

1

繼AkashBhave給出的答案你可能看看這段代碼保存圖像..

private void SaveImage(Bitmap finalBitmap) { 
String root = Environment.getExternalStorageDirectory().toString(); 
File myDir = new File(root + "/saved_images");  
myDir.mkdirs(); 
Random generator = new Random(); 
int n = 10000; 
n = generator.nextInt(n); 
String fname = "Image-"+ n +".jpg"; 
File file = new File (myDir, fname); 
if (file.exists()) file.delete(); 
try { 
    FileOutputStream out = new FileOutputStream(file); 
    finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
    out.flush(); 
    out.close(); 

} catch (Exception e) { 
     e.printStackTrace(); 
} 
} 
相關問題